Просто добавьте больше итераций, чтобы дать ЦП время нарастить до максимальной тактовой частоты. Ваши "медленные" времена связаны с ЦП на маломощной тактовой частоте холостого хода.
Очевидно, QtCreator использует достаточно процессорного времени, чтобы это произошло до запуска вашей программы, иначе вы компилируете + работаете, и процесс компиляции служит для разогрева. (по сравнению с вилкой / execve bash
, имеющей меньший вес.)
См. Idiomati c способ оценки производительности? для получения дополнительной информации о выполнении прогонов при тестировании, и также Почему эта delay-l oop начинает работать быстрее после нескольких итераций без сна?
На моем i7-6700k (Skylake) работает Linux, увеличивая l oop счетчик итераций до 1000 достаточен для того, чтобы последние итерации работали на полной тактовой частоте, даже после того, как первая пара итераций обрабатывает ошибки страниц, разогревает iTLB, кэш uop, кеши данных и т. Д.
$ ./a.out
It took 244 ns
It took 150 ns
It took 73 ns
It took 76 ns
It took 75 ns
It took 71 ns
It took 72 ns
It took 72 ns
It took 69 ns
It took 75 ns
...
It took 74 ns
It took 68 ns
It took 69 ns
It took 72 ns
It took 72 ns # 382 "slow" iterations in this test run (copy/paste into wc to check)
It took 15 ns
It took 15 ns
It took 15 ns
It took 15 ns
It took 16 ns
It took 16 ns
It took 15 ns
It took 15 ns
It took 15 ns
It took 15 ns
It took 14 ns
It took 16 ns
...
В моей системе для параметра energy_performance_preference установлено значение balance_performance
, поэтому аппаратный регулятор P-состояния не такой агрессивный, как с performance
. Используйте grep . /sys/devices/system/cpu/cpufreq/policy[0-9]*/energy_performance_preference
, чтобы проверить, используйте sudo
, чтобы изменить его:
sudo sh -c 'for i in /sys/devices/system/cpu/cpufreq/policy[0-9]*/energy_performance_preference;do echo balance_performance > "$i";done'
Однако даже запуска под perf stat ./a.out
достаточно, чтобы очень быстро увеличить тактовую частоту до максимальной; это действительно не займет много времени. Но синтаксический анализ команды bash
после того, как вы нажмете return, - это очень дешево, не так много работы процессора, прежде чем он вызовет execve
и достигнет main
в вашем новом процессе.
printf
с выводом с линейной буферизацией - это то, что занимает большую часть времени процессора в вашей программе, BTW. Вот почему требуется так мало итераций, чтобы набрать скорость. например, если вы запустите perf stat --all-user -r10 ./a.out
, вы увидите, что такты ядра пользовательского пространства в секунду равны всего лишь 0,4 ГГц, остальное время, проведенное в ядре в системных вызовах write
.