Предложения по улучшению
Определение того, подходит ли среда выполнения для тестирования производительности (например, определение, подключен ли отладчик или отключена оптимизация jit, что может привести к неправильным измерениям).
Измерение отдельных частей кода независимо (чтобы точно определить узкое место).
- Сравнение различных версий / компонентов / фрагментов кода (в первом предложении вы говорите: «... тестирование небольших фрагментов кода для определения того, какая реализация является самой быстрой.»).
Относительно № 1:
Чтобы определить, подключен ли отладчик, прочитайте свойство System.Diagnostics.Debugger.IsAttached
(Не забудьте также обработать случай, когда отладчик изначально не подключен, но через некоторое время подключен).
Чтобы определить, отключена ли оптимизация jit, прочитайте свойство DebuggableAttribute.IsJITOptimizerDisabled
соответствующих сборок:
private bool IsJitOptimizerDisabled(Assembly assembly)
{
return assembly.GetCustomAttributes(typeof (DebuggableAttribute), false)
.Select(customAttribute => (DebuggableAttribute) customAttribute)
.Any(attribute => attribute.IsJITOptimizerDisabled);
}
Относительно № 2:
Это можно сделать разными способами. Одним из способов является предоставление нескольких делегатов, а затем их измерение по отдельности.
Относительно № 3:
Это также может быть сделано разными способами, и разные варианты использования потребуют совершенно разных решений. Если эталонный тест вызывается вручную, тогда запись в консоль может быть удобной. Однако, если тестирование выполняется автоматически системой сборки, то запись в консоль, вероятно, не так хороша.
Один из способов сделать это - вернуть результат теста в виде строго типизированного объекта, который можно легко использовать в разных контекстах.
Etimo.Benchmarks
Другой подход заключается в использовании существующего компонента для выполнения тестов. На самом деле, в моей компании мы решили выпустить наш инструмент для тестирования в открытом доступе. По своей сути он управляет сборщиком мусора, дрожанием, прогревом и т. Д., Как и некоторые другие ответы здесь. У этого также есть три особенности, которые я предложил выше. Он управляет несколькими вопросами, обсуждаемыми в блоге Эрика Липперта 1050 *.
Это пример вывода, где сравниваются два компонента и результаты записываются в консоль. В этом случае два сравниваемых компонента называются 'KeyedCollection' и 'MultiplyIndexedKeyedCollection':
Существует пакет NuGet , образец пакета NuGet , а исходный код доступен по адресу GitHub . Существует также сообщение в блоге .
Если вы спешите, я предлагаю вам получить образец пакета и просто изменить делегатов образца по мере необходимости. Если вы не спешите, возможно, было бы неплохо прочитать сообщение в блоге, чтобы понять детали.