Сравнительный анализ кода точно

Мне нужно измерить производительность моего кода с максимально возможной точностью.

В настоящее время я использую следующее:
 – Секундомер для измерения времени.
 – Настройка привязки процессов для использования одного и того же ядра ЦП все время.
 – Установка максимального приоритета потока.
 – Выполнение прогрева перед измерением.
- Запустить тест 1000 раз и вычислить среднее значение

Тем не менее, у меня все еще есть разница между прогонами тестов (максимум около 1%). Любые идеи, как сделать это измерение более точным?


person user626528    schedule 21.03.2013    source источник
comment
Это может показаться смешным, но: написать свою собственную ОС, которая не запускает 200 других процессов одновременно? Серьезно, любой другой запущенный процесс повлияет на результат вашего теста. Действительно ли разница в 1% так велика всего за 1000 прогонов? знак равно   -  person J. Steen    schedule 21.03.2013
comment
На самом деле, не беспокойтесь о разнице в 1% в ОС не реального времени!   -  person Matthew Watson    schedule 21.03.2013


Ответы (3)


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

Кроме того, использование памяти, использование жесткого диска и поведение сборщика мусора могут различаться в зависимости от выполнения. Возможно, вашим вычислениям нужна виртуальная память, которая намного медленнее, чем доступ к ОЗУ. И так далее...

Что касается GC, вы можете попробовать поиграть с различными настройками «GCSettings.LatencyMode», чтобы увидеть, меняет ли это что-либо (см. http://blogs.microsoft.co.il/blogs/sasha/archive/2008/10.08/low-latency-gc-in-net-3-5.aspx).

В одном сеансе на одном и том же компьютере секундомер довольно точен: если продолжительность отличается между выполнением, это, вероятно, не из-за отсутствия точности в измерении, а потому, что сам процесс не всегда занимает одно и то же время... Очевидно, каждая «итерация» вашего теста должна занимать не менее нескольких сотен миллисекунд, секундомер никогда не сможет измерить продолжительность в наносекундах...

И вариация в 1% совсем не удивительна.

person AFract    schedule 21.03.2013

Есть ли какая-либо причина, по которой производительность будет отличаться, например, внешний компонент?

Разница в 1% не намного превышает 1000 запусков производительности, особенно если она зависит от чего-либо внешнего, такого как подключение к базе данных или службе.

Секундомер — самый точный метод измерения времени, поэтому я бы не беспокоился об этом.

person finman    schedule 21.03.2013
comment
Какие-то другие процессы запущены? Можете ли вы установить привязку ядра ЦП к чему-либо, кроме CPU0? Когда вы говорите о разнице в 1%, сколько времени варьируется от и до? Являются ли выбросы редкими или результат распределения времени достаточно разбросан (стандартное отклонение) - person finman; 21.03.2013

  1. Запустите код прогрева не менее чем на 10 секунд перед началом моих измерений. Это необходимо для того, чтобы ЦП работал на максимальной скорости.

  2. Измеряйте наименьшее время выполнения, а не среднее.

Благодаря этим двум улучшениям я получил очень стабильные результаты измерений.

person user626528    schedule 21.06.2013