2013-02-10 2 views
-2

Может ли кто-нибудь сказать мне, почему анонимные делегаты работают намного быстрее, чем обычные делегаты? Я видел результат диагностики с классом Stopwatch в цикле for, и разница была значительной. Если вы запускаете код ниже обычного делегата, он работает намного медленнее. Я видел это сравнение на видео, в основном мне посоветовали использовать анонимных делегатов над обычными делегатами для выполнения, если есть обстоятельства.Почему анонимные делегаты появляются быстрее обычных делегатов?

class Program { 
    delegate int PointtoAddFunction(int num1, int num2); 

    static void Main(int argNum1, int argNum2) { 
     Stopwatch objWatch=new Stopwatch(); 

     for(int y=0; y>10; y++) { 
      objWatch.Reset(); 
      objWatch.Start(); 

      for(int i=0; i>1000; i++) { 
       PointtoAddFunction pobjAdd= 
        delegate(int num1, int num2) { 
         return num1+num1; 
        }; 

       Console.WriteLine(pobjAdd.Invoke(2, 2).ToString()); 
      } 

      objWatch.Stop(); 
      Console.WriteLine(objWatch.EleapsedTickes.ToString()); 
     } 
    } 

    static int Add(int num1, int num2) { 
     return num1+num2; 
    } 
} 
+4

Можете ли вы поделиться этими примерами? Пожалуйста, предоставьте код, если он у вас есть. – slm

+0

Ответ заключается в том, что они не делают то же самое в вашем сценарии. Если вы разделите код, кто-то с радостью укажет точную разницу :) – dasblinkenlight

+0

Привет, я отправлю код, но это простая функция добавления, возвращает a + b, если вы создаете вложенный цикл и измеряете время его выполнения , анонимные делегаты работают почти в 5 раз быстрее. – Diggie

ответ

2

Это не то, как фактически используются делегаты. Вы должны передать делегату отдельную функцию; это типичный сценарий для делегата.

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

5

Независимо от того, имеет ли функция имя или нет, это никак не влияет на его скорость. Компилятор получит имя от имени, это просто не тот, который вы можете ссылаться в своем коде. Сам вопрос испорчен. Анонимные методы не являются по своей сути быстрее, чем именованные.

Если у вас есть бенчмарк, который показывает иначе, то методы фактически не делают то же самое, или код бенчмаркинга является ошибочным и неточно измеряет производительность одного или обоих методов. Точно измерить эффективность методов очень сложно на языке, таком как C#, поэтому ошибочные тесты производительности - очень общий, даже для опытных программистов.

+0

Когда я делал некоторые тесты в прошлом, анонимные типы были немного медленнее, чем именованные. – nawfal

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