Делегат внутри метода с generic параметром в 200 раз медленнее

6yrop

Натолкнулся вот на какую особенность .NET-а. После формального рефакторинга некоторого кода, обнаружил, что код стал работать медленнее на два порядка. Детальный разбор ситуации отложил на потом. Поделился наблюдениями с коллегами, и один из них раскопал вот какую особенность. Метод util.Method2<string> работает в 200 раз медленнее метода util.Method1

public void Method1
{
Func<int> func = => 2 + 2;
func;
}

public void Method2<T>
{
Func<int> func = => 2 + 2;
func;
}

Под Reflector-ом в IL-коде видно, что в первом случае инстанс делегата кешируется в скрытом поле текущего класса, а во втором создается каждый раз.

bleyman


using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
using System.Diagnostics;

namespace TestCS
{
class Program
{
public int Method1
{
Func<int> func = => 2 + 2;
return func;
}

public int Method2<T>
{
Func<int> func = => 2 + 2;
return func;
}

public int Measure
{
int iterations = 10000000;
Stopwatch sw = new Stopwatch;
sw.Start;
int tmp = 0;
for (int i = 0; i < iterations; i++)
{
tmp += Method1;
}
sw.Stop;
Console.WriteLine(sw.ElapsedMilliseconds);
sw.Reset;
sw.Start;
for (int i = 0; i < iterations; i++)
{
tmp += Method2<int>
}
sw.Stop;
Console.WriteLine(sw.ElapsedMilliseconds);
return tmp;
}


static int Main(string[] args)
{
return (new Program.Measure;
}
}
}

В релизе получается что-то такое:
279
308
Ксли добавить ngen $(TargetPath) в пост-билд эвент, то
152
302
Два раза - это не два порядка. Давай-ка свой код, а то у меня появляется страшное подозрение, что умный компилятор попросту соптимизировал у тебя что-то нафиг.

bleyman

ОЙ!
Прости, не заметил, что ты его вызываешь со string.
Да, с любым референс тайпом (даже с object) почему-то работает дико медленно.
Надо бы в M$ написать, что ли...
EDIT: А connect как раз сейчас на maitenance, лол.

6yrop

Да, с любым референс тайпом (даже с object) почему-то работает дико медленно.
да, прикольно, на value type-ах работает быстро :)
EDIT: А connect как раз сейчас на maitenance

что?

Dasar

а если класс generic, такая же херня или нет?
Оставить комментарий
Имя или ник:
Комментарий: