Здравствуйте, 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?
Даже самую простую задачу можно сделать невыполнимой, если провести достаточное количество совещаний