Учимся писать правильные C#-бенчмарки
У меня с коллегами нередко возникают разговоры о быстродействии того или иного участка кода. Часто они перерастают в спор о том, какое же решение работает более быстро. И в этой ситуации чаще лучше набросать простенький бенчмарк, чем вести долгие философские разговоры о производительности. К сожалению, очень многие не умеют бенчмаркать правильно, в результате чего их тесты могут показать в корне неверные результаты. Поэтому мне хотелось бы обсудить наиболее важные вещи, которые нужно учитывать при составлении грамотного бенчмарка на C#. Release mode without debugging Одной из самых распространённых ошибок при тестах производительности является запуск программы в Debug mode. Результаты, полученные таким образом могут в принципе не соответствовать действительности. Дело в том, что в Debug build компилятор C# добавляет множество IL-команд, которые могут значительно сказаться на производительности. Кроме того, запускать следует обязательно без отладки (Ctrl+F5 из студии, а ещё лучше — из консоли). Если запустить приложение с отладкой (F5 из студии), то отладочный код также сильно попортит результаты вашего бенчмарка. Более подробное описание этой проблемы можно найти у Эрика Липперта. Прогрев кеша процессора Запуск вашего теста должен осуществляться обязательно на прогретом кеше. Для этого необходимо перед замером времени запустить тест вхолостую несколько раз. Некоторые в порядке прогрева делают только один-два холостых запуска, но в реальности порой требуется 10–15 запусков, чтобы кеш действительно прогрелся. Лучше всего греть кеш до тех пор, пока колебания замеров времени от запуска к запуску не станут меньше некоторого небольшого процента. Результаты бенчмарка на непрогретом кеше могут быть дольше реальных в несколько десятков раз. Читать дальше →