Re[5]: быстрый ToEnumerable
От: tyomchick Россия  
Дата: 26.04.15 11:07
Оценка:
Здравствуйте, hi_octane, Вы писали:

T>>Т.е. большая нагрузка на кучу сохраняется.

T>>Получается объект всё равно в кучке создается или просто при приведении к интерфейсу всё равно боксинг происходит?

_>В этом случае решарпер показал аж 3 боксинга. После того как я изменил код на использование stopwatch, сделал несколько проходов для устаканивания JIT, добавил GC.Collect, а твой сам-себе итератор поправил на класс чтобы ушли боксинги, получилось примерно так.


Ага, спасибо за нормальный тестер.

Правда на моей рабочей машине результат не стабильный. Судя по всему дело в том, что мой комп беден оперативкой и в ходе теста запускается сборщик мусора. На это указывают и странные показатели по памяти. И тест производительности по сути мало что показывает, т.к. портится запуском сборщика.
Я заменил в этом тесте бесполезный показатель Memory WS, на CollectionCount(0):

  код
static void RunTest(int num, Func<int> test)
{
    Console.WriteLine("Тест {0} запущен", num);
        var memoryGC = GC.GetTotalMemory(false);
        var collectionCount = GC.CollectionCount(0);            

        stopwatch.Reset();
        stopwatch.Start();
        test();
        stopwatch.Stop();

        Console.WriteLine("Time: {0}, Memory GC: {1}, Collection count: {2}", stopwatch.ElapsedMilliseconds,
                          GC.GetTotalMemory(false) - memoryGC, GC.CollectionCount(0) - collectionCount);
}

Получилось такое:

Тест 0 запущен
Time: 17, Memory GC: 0, Collection count: 0
Тест 1 запущен
Time: 414, Memory GC: 1073152, Collection count: 133
Тест 2 запущен
Time: 447, Memory GC: 1531904, Collection count: 190
Тест 3 запущен
Time: 448, Memory GC: 1385824, Collection count: 171
Тест 4 запущен
Time: 331, Memory GC: 614400, Collection count: 76


Уменьшил число итераций в 200 раз. Запускал с приоритетом "Real Time", для предотвращения переключения контекста процессора. Результат в тиках (stopwatch.ElapsedTicks):

Тест 0 запущен
Time: 305, Memory GC: 0, Collection count: 0
Тест 1 запущен
Time: 15790, Memory GC: 1392640, Collection count: 0
Тест 2 запущен
Time: 17193, Memory GC: 1998848, Collection count: 0
Тест 3 запущен
Time: 17490, Memory GC: 1794048, Collection count: 0
Тест 4 запущен
Time: 12304, Memory GC: 794624, Collection count: 0


Получается из реальный итераторов (к коим "сам-себе", как ты справедливо заметил не относится) самый быстрый yield?
Даже самую простую задачу можно сделать невыполнимой, если провести достаточное количество совещаний
Отредактировано 26.04.2015 11:08 tyomchick . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.