Здравствуйте, VladD2, Вы писали:
VD>Твой тест будет измерять скорость работы GC. На фоне выделения помяти какие-то там вызовы делегатов просто не будут заметны.
Хорошо, давай сварганим тест без выделения памяти.
class MyCompare : IComparer<int>
{
public int Compare(int a, int b)
{
return a.CompareTo(b);
}
}
int[] ar = new int[] { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
int[] tst = new int[ar.Length];
MyCompare cmp = new MyCompare();
for(int i = 0; i < 10000000; i++)
{
ar.CopyTo(tst, 0); // {1}
// Array.Sort(tst, cmp); {2}
// Array.Sort(tst, delegate(int a, int b) { return a.CompareTo(b); }); {3}
}
Копирование ({1}) ~1.4 сек.
Копирование + сортировка ({1}+{2}) ~10.6
Копирование + сортировка ({1}+{3}) ~11.8
Я думаю не надо быть гением, чтобы сделать соответствующие выводы.
D>>Насчет делегатов ты конечно прав, а вот насчет интерфейсов погорячился.
VD>Извини, но я изучил впорос о котором говорю, а вот ты высказываешь свои предположения. Вызов метода интерфейса где-то 2-3 раза медленее нежели виртуального метода. Вот только подобными бэнчмарками это не выявишь. Тут и комплитор может соптимизировать, и предсказание ветвления в процессоре срабатывать начинает.
Мои предположения основанны, на собственном опыте и проведенных тестах. Никаких чудес JIT над косвенными вызовами не делает.
Во всяком случае виртуальный вызов не может быть сооптимизирован до прямого и до кучи заинлайнен.
Предсказание ветвлений это уже ближе к теме, но для этого и делают несколько подряд тестов и собирают усредненные результаты.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>