- PVSM.RU - https://www.pvsm.ru -
У меня с коллегами нередко возникают разговоры о быстродействии того или иного участка кода. Часто они перерастают в спор о том, какое же решение работает более быстро. И в этой ситуации чаще лучше набросать простенький бенчмарк, чем вести долгие философские разговоры о производительности. К сожалению, очень многие не умеют бенчмаркать правильно, в результате чего их тесты могут показать в корне неверные результаты. Поэтому мне хотелось бы обсудить наиболее важные вещи, которые нужно учитывать при составлении грамотного бенчмарка на C#.
Process.GetCurrentProcess().ProcessorAffinity = new IntPtr(1);
Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.High;
Thread.CurrentThread.Priority = ThreadPriority.Highest;
GC.Collect()
. А лучше бы его вызывать два раза, чтобы все корневые объекты перешли во второе поколение (подробнее можете почитать тут [6]). Дождаться окончания выполнения всех финализаторов (если таковые имеются) тоже не помешает (в этом нам поможет GC.WaitForPendingFinalizers()
).Я перечислил некоторые важные моменты, которые необходимо помнить при написании бенчмарка. Я люблю побенчмаркить, но каждый раз заново в каждом новом приложении обеспечивать чистоту эксперимента меня утомляет. Кроме того, хочется получить результаты теста в красивом виде, а возиться каждый раз с форматированием неохота. Поэтому я написал простенький проект BenchmarkDotNet [7] (доступен на GitHub), который в удобном виде позволяет оценить производительность интересующих нас участков кода — достаточно лишь описать целевые методы. Надеюсь, этот проект поможет другим C#-разработчиком правильно оценить производительность их кода. Если же вы можете подсказать дополнительные вещи, которые следует учитывать для корректных замеров времени, то буду рад PullRequest-ам.
Автор: DreamWalker
Источник [8]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/net/41935
Ссылки в тексте:
[1] можно найти: http://tech.pro/blog/1293/c-performance-benchmark-mistakes-part-one
[2] ProcessorAffinity: http://msdn.microsoft.com/ru-ru/library/system.diagnostics.process.processoraffinity.aspx
[3] Stopwatch: http://msdn.microsoft.com/ru-ru/library/system.diagnostics.stopwatch.aspx
[4] Эрика Липперта: https://tech.pro/tutorial/1295/c-performance-benchmark-mistakes-part-two
[5] dotnetperls: http://www.dotnetperls.com/stopwatch
[6] тут: http://www.rsdn.ru/article/dotnet/GC.xml
[7] BenchmarkDotNet: https://github.com/AndreyAkinshin/BenchmarkDotNet
[8] Источник: http://habrahabr.ru/post/191636/
Нажмите здесь для печати.