Re[54]: Как скрестить ужа и ежа или статическую и утиные тип
От: Denis2005 Россия  
Дата: 28.01.07 16:27
Оценка:
Здравствуйте, 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>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.