2013-11-23 2 views
1

Надеюсь, на мой вопрос еще нет ответа, я только нашел this link, но на самом деле я не отвечаю на мой точный вопрос.Разница в производительности между передачей ссылки и использованием локальной переменной

В основном у меня есть класс MyClass который содержит локальный элемент currentSettings другого класса Settings. MyClass содержит метод DoStuff, который использует информацию, которая содержится в любом объекте объекта Settings.

Теперь ситуация: метод никогда не будет вызван внутри самого класса. Некоторые другие классы будут содержать объект 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

Лучший ответ - рассказать вам сравнить его и увидеть результаты для себя.

Upfront, я бы сказал, вы не заметите существенной разницы между обоими. Вы передаете ссылку, которая является только указателем C# за кулисами. Я предполагаю, что большая часть вашего времени процессора будет внутри самого метода, а не называть его.

Я буду ждать ваших отзывов, даже лучше результатов теста.

+1

Я отправил ответ на мой вопрос по вашему запросу. Спасибо за ваш ответ. – phil13131

1

Хорошо, я сделал быстрый грязный тест производительности и получается разница совсем не заметна:

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, в ссылка проходит почти всегда быстрее, что, однако, может быть по многим причинам, так как занимает всего несколько тысяч тиков.

Смежные вопросы