2013-11-23 19 views
1

希望我的問題還沒有得到解答,我只找到了this link,但它並沒有真正回答我的確切問題。通過參考和使用本地變量之間的性能差異

基本上我有一個類MyClass其中包含另一類Settings的本地成員currentSettingsMyClass包含一個方法DoStuff,它使用包含在對象的任何對象中的信息。

現在的情況:該方法永遠不會從類內部調用。其他一些類將包含一個MyClass對象,並且只有從那裏調用該方法。現在我有兩種可能性:

class MyClass 
{ 
    Settings currentSettings = new Settings(); 

    public void DoStuff() 
    { 
     //do stuff here using things stored in "currentSettings" 
    } 

    public void DoStuff(Settings settings) 
    { 
     //do stuff here using things stored in "settings" 
    } 
} 

class SomeClass 
{ 
    MyClass myClass = new MyClass(); 

    ... 
    //call method somewhere, with two different options: 
    myClass.DoStuff(); 

    myClass.DoStuff(myClass.currentSettings); 
} 

課程的第二個變體似乎有點過於複雜,但是,它給我留下的自由傳遞任何設置,它可能不是本地成員currentSettings,而且我需要在一些案例。

我現在關注這兩個選擇之間的性能差異,並且如果引用傳遞可能比使用本地設置慢得多,因爲此方法可能經常被調用(高達每秒幾百次)。

編輯:我已經發布了一些性能測試的答案,並找不到兩種方法之間的任何顯着差異。

+0

嘗試一下並自己測量一下,但應該有接近零的性能差異。 –

+0

對不起,是的,我當然可以(也會)自己做。這是一個普遍的問題,如果在一些隨機的情況下可能存在顯着的差異,這是我不知道的。 – phil13131

+2

不要爲了微不足道的性能收益妥協一個好的軟件設計(假設,並且我相信這樣,在這種情況下沒有顯着的收益) –

回答

4

應該幾乎沒有性能差異。你所做的只是重新排序幾條指令,所有這些都與本地內存有關。

課程的第二變體似乎有點過於複雜

傳遞一個參數的方法並不絲毫過於複雜。

它讓我自由地通過任何設置,它可能不是本地成員currentSettings我需要在某些情況下

該聲明的第二部分單獨告訴我你應該使用參數。

+0

謝謝你的回答。我問的主要原因是,我可以選擇簡單地實現方法的兩個重載,並根據所用設置的選擇來調用它。但爲此,我不得不重新編程,我想知道這是否值得。 – phil13131

+0

如果您想知道,正確的重載方法是在編譯時計算的,所以在運行時有很多重載沒有區別。 –

1

最好的答案是告訴你對它進行基準測試併爲自己查看結果。

預計我會說你會注意到兩者之間沒有顯着差異。你在後臺傳遞一個只是C#指針的引用。我想你的大部分cpu時間都會在方法本身內而不是調用它。

我會等待您的反饋,甚至更好的基準測試結果。

+1

我已根據您的要求發佈了對我的問題的答案。感謝您的回覆。 – phil13131

1

好吧,我做了一個快速骯髒的性能測試和原來不同的是完全不noticable:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     MyClass mc = new MyClass(); 
     Stopwatch sw = new Stopwatch(); 
     Settings set = new Settings(); 
     sw.Start(); 
     for (int i = 0; i < 1000000; i++) 
     { 
      mc.DoStuff(); 
     } 
     sw.Stop(); 
     tb1.Text = sw.ElapsedTicks.ToString(); 

     sw.Restart(); 
     for (int i = 0; i < 1000000; i++) 
     { 
      mc.DoStuff(set); 
     } 
     sw.Stop(); 
     tb2.Text = sw.ElapsedTicks.ToString(); 

    } 
} 

class MyClass 
{ 
    Settings currentSettings = new Settings(); 

    public void DoStuff() 
    { 
     int test = 0; 
     for(int k = 0; k < 10 ; k++) 
     { 
      test += currentSettings.i + currentSettings.j; 
     } 

    } 

    public void DoStuff(Settings settings) 
    { 
     int test = 0; 
     for (int k = 0; k < 10; k++) 
     { 
      test += settings.i + settings.j; 
     } 
    } 
} 

class Settings 
{ 
    public int i = 1, j = 2; 
} 

雖然我已經注意到,設置在循環重複的數量減少到10000個,引用傳遞幾乎總是更快,但是由於許多原因,它只需要幾千個滴答。

相關問題