2013-09-18 2 views
0

Я написал несколько часто используемых методов, в которых я нашел, что производительность очень важна. Сделав несколько изменений, чтобы исправить заметные ошибки производительности, я хотел бы провести несколько тестов, чтобы убедиться, что производительность не ухудшилась из-за будущих изменений. Тем не менее, я нахожу, что эти тесты часто очень шелушатся (вероятно, из-за сбора мусора, другой активности на нашем автоматизированном сервере тестирования и т. Д.). Мне интересно, есть ли принятая передовая практика для написания и поддержания подобных тестов?Что представляет собой хороший способ создания тестов нечеткой производительности

До сих пор большинство моих тестов выглядеть следующим образом:

runMyCode(); // for assembly loading/jitting 
var sw = Stopwatch.StartNew(); 
for (iterations) { runMyCode(); } 
var time = sw.Elapsed; 

// then either 
Assert.Less(time, TimeSpan.FromSeconds(some reasonably generous amount of time)); 
// or 
// time some other piece of benchmark code (e. g. a framework method 
// which runMyCode() layers on top of). And do: 
Assert.Less(time.TotalSeconds, someMultiplier * benchmarkTime.TotalSeconds); 

Одна мысль, я должен был улучшить стабильность будет иметь тестовый магазин записанный раз в базе данных, и только потерпеть неудачу, если последние N раз не удалось провести тест.

+2

Взгляните на [это] (http://tech.pro/blog/1293/c-performance-benchmark-mistakes-part-one). –

ответ

2

Посмотрите эту статью: Learn how to create correct C# benchmarks. Основные советы для вас дел:

  • Вы должны использовать прогрев кэша процессора для получения скорректированных результатов
  • Вы должны запустить код на одном процессоре (Process.GetCurrentProcess().ProcessorAffinity = new IntPtr(1))
  • Вы должны установить высокий приоритет для резьбы и процесс
  • Вы должны запустить GC.Collect() перед тем эталоном
  • Вы должны запустить эталонные несколько раз и принять медиану результатов

    Также вы можете использовать эту бесплатную платформу .NET с открытым исходным кодом для создания адекватного теста: BenchmarkDotNet.

+0

Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. –

+0

@briandfoy, спасибо, я добавил некоторые ключевые моменты из статьи. – AndreyAkinshin

1

Я не знаю, если вы используете Visual Studio или моно разработки, но вы можете использовать скорость профилировщика инструменты, такие как:

RedGate: http://www.red-gate.com/products/dotnet-development/ants-performance-profiler/?utm_source=google&utm_medium=cpc&utm_content=unmet_need&utm_campaign=antsperformanceprofiler&gclid=CPfS1Z_k1bkCFYuk4Aoda3oAVg

или использование по умолчанию Visual Studio профайлер производительности. См. Этот учебник: http://msdn.microsoft.com/en-us/library/ms182372.aspx (Гораздо больше в Интернете).

+0

По мере того, как я пытаюсь сформулировать в своем вопросе, я не собираюсь выполнять один прогон профилирования, а скорее защищать от ухудшения производительности в будущем с помощью автоматизированного теста. Могут ли эти инструменты сделать это? – ChaseMedallion

+0

О, извините за мое недоразумение. Redgate может это сделать. Для профайлера производительности визуальной студии я никогда не пробовал этот тест. Вы можете попробовать все это (vsp интегрирован в визуальную студию, а redgate дает вам незабываемое завершенное испытание) –

Смежные вопросы