2015-10-31 55 views
-1

假設我有包含3個字符串屬性的類A。 A的新實例正在整個應用程序中不必要地創建多次。所有A類都使用這3個字符串執行LINQ查詢,如:C# - 與字符串屬性重複使用對象與創建新實例的性能

Where(string1 == this.string1).Where(string2 == this.string2).Where(string3 == This.string3)

不是每次創建實例都需要對象,我正在考慮修改使用此類型的類來存儲對象的一個​​實例,然後在每次使用它之前修改字符串屬性。這是優化班級的正確方法嗎?基本上,我試圖避免每次創建實例併爲字符串分配內存的開銷。

是否有更快的方式來執行上述LINQ查詢呢?

+0

您需要對代碼**和性能**進行編碼。 – Enigmativity

+0

「包含」三個字符串的類很小,因爲字符串本身並不「包含」。您需要了解類是如何存儲的,字符串是如何存儲的,您需要了解字符串實習,您需要了解垃圾收集和GC0,1和2的成本。然後,您可能會考慮優化此類。 –

+0

創建不同的字符串創建持有實例的成本可能更高。這就是說,除非字符串是巨大的,這聽起來像是不成熟的優化。不要試圖猜測性能問題。然後測量優化。 –

回答

0

是的。但除非有很多這些對象,否則性能的差異可以忽略不計。

+1

你怎麼知道這可以忽略不計? – Enigmativity

+0

按照經驗.. –

+0

你怎麼知道需要多長時間''新'A'的實例? OP的對象池是如何執行的? – Enigmativity

0

如果「幾次」是在幾千的順序,那麼我不會擔心創建對象的性能。只有當你創建這麼多的應用程序時,必須頻繁地執行垃圾收集來清理未使用的對象,對於具有3個屬性的對象來說,對於具有3個屬性的對象來說,除非你的字符串非常大,否則它將需要數百萬的數量級。

您更可能通過嘗試重用對象來創建錯誤,因爲您有可能在重用之間忘記清除對象狀態。

嘗試重複使用該對象可能意味着將其移動到高於必要範圍的更高級別範圍。即更改對某個屬性的本地引用或類似內容。

保持您的代碼簡單,而不是實現過早的優化,以至於當您確實遇到優化非常重要的情況時,則可以更輕鬆地實現優化。如果你過度優化你所能想象的一切,那麼你將最終得到一個複雜的代碼庫。

更新:

我正在考慮修改使用這種類型的存儲對象的 一個實例,然後在每次使用前修改字符串屬性 類。這是優化 課程的正確方法嗎?

你沒有在內存分配領域節省很多。由於每次都要分配新字符串,因此大多數分配都是在創建字符串時創建的,而不是創建對象。

外部對象由多於3個指針組成。

無論您是否重複使用同一個對象,大部分內存分配都是每次都創建字符串。

如果您要投入優化,您的努力應該集中在最有利的地方。致力於優化的努力應該從分析開始,以確定你的慢點在哪裏。這意味着優化那些被認爲是問題領域的東西。

+0

有沒有另外一種方法來優化這個不會使代碼複雜太多? – Andrew

+0

@Andrew不知道你的應用程序結構,我猜測答案是否定的。過早優化的問題是您正在優化已經非常有效的東西。在編譯器和垃圾收集器之間,有很多非常先進的算法來優化代碼和內存。除非您處於非常特殊的情況下,否則您所做的任何事情都不會顯着提高性能,除非您已確定了明顯的性能問題。 – AaronLS

+0

這有點像試圖用砂紙打磨鏡子。鏡子已經非常光滑,用粗砂紙打磨它不太可能,而且可能會讓它變得更糟。 – AaronLS

相關問題