2016-08-30 88 views
0

我已將.net 4.0解決方案升級到.net 4.6.1並觀察到一些奇怪的行爲。解決方案從.net 4升級到4.6.1後性能下降

我有一個程序,在這個程序中我有一個序列(稱爲sequence1),它讀取雙精度數組的二進制文件並將數據保存在RAM中。

在升級之前,每當我運行這個sequence1(程序是單線程的)時,機器使用25%的CPU(在4核心機器中)。 自升級以來,這種行爲發生了改變,如果我用sequence1開始我的程序,我得到正常行爲(序列運行在25%),但如果在執行某些算術計算並分配一些類之前,我們稱之爲sequence1sequence0,然後當我到達sequence1它使用70-90%的CPU。

我認爲這可能會連接到垃圾收集機制。我試過設置所有的類爲空,並在序列0之後立即調用GC.Collect(在致電序列之前),但我仍然得到序列1,其運行在70-90%;也許這與GC算法有關,它更新了它在執行序列0時發生了脫落?

+0

也許'gcConcurrent'現在處於活動狀態?你可以玩app.config文件中的行爲。主要問題是,現在速度更快嗎?也可以是PGO(參見我的一個重要問題)。 – leppie

+0

您需要描述應用程序的性能,而不是對問題進行猜測。首先你應該看看.NET的perfmon計數器,並將這兩個運行與這些運行進行比較,以查看有什麼不同。 – Paolo

+0

@Paolo,我會嘗試perfmon和比較,但即使沒有比較,單線程程序不應該超過25%(更不用說90%),應該嗎? –

回答

1

升級到4.6.1可能導致GC.Collect()調用花費更長時間, 嘗試檢查是否有任何顯式調用垃圾回收。 這也解釋了爲什麼在完成分配內存的作業之後獲得更多的CPU使用率,如果分配的對象更多,則垃圾回收將花費更長的時間。

+0

看起來像你是對的,我發現並刪除了一個GC呼叫,再次運行它的CPU使用率沒有上升。它看起來像.net 4.6喜歡自動處理GC收集,現在我所要做的就是儘量記住爲什麼我首先要做這個調用。 –

相關問題