2017-03-08 57 views
-1

我對我在程序中看到的東西感到非常困惑。C# - 內存中的對象數量是否影響本地處理的性能?

比方說,我們有兩個大對象(從2個外部文件加載)的列表。

然後我遍歷每一個對象和每一個I調用一個方法,它執行一串處理。

只是想說明:

foreach (var object in objects) 
    { 
     object.DoSomething(); 
    } 

在第一種情況下,對象包含2項。它完成得非常快,我跟蹤每個對象的進度,每個對象的處理速度非常快。

然後我再次運行程序,這次加入一些輸入文件,所以不是2,我不得不讓我們說6個對象。因此,代碼再次運行,並且之前的2個對象仍然存在,還有一些更多,但由於某些奇怪的原因,現在每個處理(每次調用object.DoSomething())比以前花費的時間要長得多。

  • 假設場景1有2個對象,objectA.Dosomething()需要1 分鐘才能完成。
  • 假設情景2,有6個對象,相同的objectA.Dosomething() 在方案1,現在需要5分鐘才能完成。

我在列表中的對象越多,每個單獨對象的每個處理所花費的時間越長。

這怎麼可能?對於特定的獨立對象,單獨處理的性能如何受到內存中對象的影響?在上面的場景1和2中,對完全相同的數據完全相同的處理如何能夠花費大量不同的時間來完成?

此外,請注意,處理從一開始就比較慢,它不會在第一個對象上快速啓動,然後逐漸減慢,它只會一直放慢,與要處理的對象數量成比例。我在那裏有一些多線程,當我開始添加更多的對象時,我可以看到線程完成率大幅下降。多線程發生在「DoSomething()」內部,它不會離開直到所有線程都完成。但是,我不認爲這個問題與多線程有關。實際上,由於緩慢,我添加了多線程。

同時請注意,最初我是合併所有輸入文件合併爲一個巨大的物體,並DoSomething的()一個單呼,我把它弄壞了下來思考這將有助於提高性能。

這是一個「正常」的行爲,如果是這樣,什麼是解決這個問題的辦法?我可以考慮其他處理數據的方式,但我仍然沒有得到這種行爲,並且我必須做些事情才能獲得預期的結果。

編輯1: 在上面的「對象」列表中的每個對象還包含較小的對象的列表(隊列),圍繞這些各個的5000。我開始相信我的問題可能是這樣的,我應該使用結構或類似的東西,而不是擁有如此多的嵌套對象。這能解釋我上面描述的行爲類型嗎?

+4

聽起來像你需要附加一個分析器,看看究竟是什麼導致了緩慢,而不是猜測和拋出線程。 –

+0

由於大物體佔用更多內存,一種可能性是參考局部性更差和GC壓力更高。如果是這種情況,您可以在迭代時逐個加載文件中的對象,例如,通過使用'IEnumerable'和迭代器延遲加載文件。 –

+0

很難肯定你給我們的東西。如果'DoSomething'方法是IO瓶頸,那麼你會看到每個單獨的迭代變得更慢。如果您沒有正確處理任何'IDisposable'或執行'using'語句,您也將看到一個漸進式的放緩。 – maccettura

回答

1

正如評論中所述,我的問題太抽象了,不能給出準確的答案。我主要想要一些指標,並知道我是否可能遇到一些內部限制。

事實證明,我忽略了一個單獨的機制,我有內部記錄結果和生成報告。我非常快速地構建了系統的這一部分,而且效率太低,而且增長速度太快。限制內部結構的大小,限制大集合的檢索量和分解小塊中的處理的技巧。

只是爲了說明,超過6小時的東西現在需要1分鐘。對我感到羞恥。更清潔的解決方案是使用數據庫,但至少現在看起來我會擺脫這個問題。

相關問題