2010-04-10 2 views
2

Один из упражнений в TC++PL спрашивает:Как эффективно измерять разницу в время выполнения

Написать функцию, которая либо возвращает значение, или, генерирующую это значение на основе аргумента. Измерьте разницу во времени выполнения между двумя способами.

Очень жаль, что он никогда не объясняет, как измерить такие вещи. Я не уверен, могу ли я написать простой счетчик времени, времени и времени, или есть более эффективные и практичные способы?

ответ

5

Для каждой из функций,

  • Получить время начала на
  • Вызовите функцию в миллион раз (или более ... миллиона это не так много, на самом деле)
  • Получить end time и вычесть из него время начала

и сравниваем результаты. Это примерно так же практично, как и измерение производительности.

+0

Спасибо, это то, о чем я и думал. –

0

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

, если вам нужно больше информации вы можете использовать коммерческий продукт, как точка следа: http://www.jetbrains.com/profiler/

1

Он не объясняет, потому что это часть упражнения.

Если серьезно, я считаю, что вы должны написать простой «старт времени», «конец времени» и большую петлю внутри.

+0

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

1

Единственное измерение, которое когда-либо имеет значение, это время настенных часов. Не позволяйте никому другому обманывать вас, чтобы поверить в что-то еще. Прочтите Lean Thinking, если вы сами не верите.

+0

Я не дал вам драйв, и я согласен с вашей точкой, Макс, но я не понимаю, как это относится к вопросу. –

+0

@Mike Dunlavey: Серьезно? Вопрос не в том, как измерить производительность чего-то? – 2010-04-11 21:26:35

+0

Непонятно, что любой способ измерения это * не * настенное время, но даже если это время только для процессора (исключая ввод-вывод и время, затрачиваемое на конкурирующие процессы), в этом случае это будет иметь смысл. Причина, по которой я согласен с вашей точкой в ​​целом, - это мой опыт настройки производительности: часто люди пропускают проблемы с производительностью, потому что их профилировщик исключает ввод-вывод, и поскольку они считают, что точное абсолютное время процессора более важно, чем приблизительное процентное время настенных часов.http: //stackoverflow.com/questions/1777556/alternatives-to-gprof/1779343#1779343 –

3

Рассмотрите возможность использования boost.timer, это примерно так же просто, как и получается.

#include <iostream> 
#include <boost/timer.hpp> 

boost::timer timer; 
for (int i = 0; i < 100000; ++i) { 
    // ... whatever you want to measure 
} 
std::cout << timer.elapsed() << " seconds.\n"; 
Смежные вопросы