2009-08-11 57 views
3

我需要從一個函數中獲取三個對象,我的直覺是創建一個新類型來返回三個參考。或者如果裁判是相同的類型,我可以使用一個數組。然而傳址裁判是比較容易:傳遞參數與包裝類型的長列表


     private void Mutate_AddNode_GetGenes(ref NeuronGene newNeuronGene, ref ConnectionGene newConnectionGene1, ref ConnectionGene newConnectionGene2) 
     { 

     } 

有明顯的沒有錯,但我毫不猶豫地使用這種方法,主要是我覺得對於美學和psycholgical偏差的原因。實際上有沒有什麼好的理由使用其中的一種方法?也許是創建額外的包裝器對象或將參數推入堆棧的性能問題。請注意,在我的特殊情況下,這是CPU密集型代碼。 CPU週期很重要。

是否有一個更優雅的C#的C#3的方法2?

謝謝。

回答

3

對於幾乎所有的計算問題,你不會注意到CPU的差異。由於您的示例代碼中包含「基因」一詞,因此您可能會遇到罕見的代碼類別,這些代碼可能會注意到。

僅僅爲了包裝其他對象而創建和銷燬對象會花費一些性能(畢竟它們需要被創建和垃圾收集)。

從審美角度講,我不會創建一個對象來對不相關的對象進行分組,但是如果它們在邏輯上屬於一起,那麼定義一個包含對象是完全正確的。

+2

PS - 相比,在堆管理數據在堆棧上管理數據是非常有效的。 – 2009-08-11 22:05:30

+1

@Eric,你爲什麼不把這個評論放在你的答案中? – 2009-08-11 22:08:35

+0

因爲在事後添加註釋會更快嗎?是否有我不知道編輯答案而不是發表評論的原因? – 2009-08-11 22:38:57

1

如果你擔心包裝類型(這是一個更清潔,恕我直言)的性能,你應該使用一個結構。 .NET的當前32位實現(和upcomming 64位4.0)支持內聯/優化掉的結構在許多情況下,所以你可能會看到一個任何結構和ref參數之間不存在性能差異。

1

擔心這兩個選項的相對執行速度可能是不成熟的優化。專注於首先使算法正確,並且具有乾淨,可維護的代碼。完成後,您可以在其上運行一個分析器,並優化20%的代碼,佔用80%的CPU時間。即使這種方法結束了20%,兩種調用方式之間的差異可能很小。

所以,除了性能問題,我可能會使用容器類。由於該方法只需要這三個參數,以及(大概)修改的每一個,它聽起來就像它將使意義它作爲容器類的方法,用三個成員變量,而不是ref參數。