Как оценить время выполнения программы? - PullRequest
4 голосов
/ 31 января 2020

Я разработал простую программу и хочу оценить ее производительность на реальном компьютере, например, на моем MacBook. Исходный код выглядит так:

#include <stdio.h>
#include <vector>
#include <ctime>

int main () {
    auto beg = std::clock () ;
    for (int i = 0; i < 1e8; ++ i) {

    }
    auto end = std::clock () ;
    printf ("CPU time used: %lf ms\n", 1000.0*(end-beg)/CLOCKS_PER_SEC) ;
}

Он скомпилирован с g cc, а флаг оптимизации установлен по умолчанию. С помощью скрипта bash я запустил его 1000 раз и записал время выполнения на моем MacBook следующим образом:

[130.000000, 136.000000): 0
[136.000000, 142.000000): 1
[142.000000, 148.000000): 234
[148.000000, 154.000000): 116
[154.000000, 160.000000): 138
[160.000000, 166.000000): 318
[166.000000, 172.000000): 139
[172.000000, 178.000000): 40
[178.000000, 184.000000): 11
[184.000000, 190.000000): 3

"[a, b): n" означает, что фактическое время выполнения та же самая программа находится между мс и б мс в течение n раз.

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

Спасибо за ответ на этот вопрос.

1 Ответ

5 голосов
/ 31 января 2020

Бенчмаркинг сложно!

Краткий ответ: используйте бенчмарк google

Длинный ответ: Есть много вещей, которые будут мешать таймингу.

  • Планирование (ОС запускать другие вещи вместо вас)
  • CPU Scaling (ОС решает, что может экономить энергию, работая медленнее)
  • Конфликт памяти (что-то еще использует память, когда вы хотите)
  • Конфликт шины (что-то еще говорит об устройстве, с которым вы хотите поговорить)
  • Кэш (ЦП удерживает значение, чтобы избежать использования памяти)
  • Миграция ЦП. (ОС переводит вас с одного процессора на другой)
  • Неточные часы (Только тактовые частоты процессора являются точными в любой степени, но они меняются при миграции)

Единственный способ избежать Эти эффекты включают отключение масштабирования ЦП, выполнение функций «cache-flu sh» (обычно просто касаясь большого объема памяти перед запуском), запуск с высоким приоритетом и привязка к одному ЦП. Даже после всего этого ваши временные интервалы будут все еще шумными, поэтому последнее, что нужно, это просто многократно повторять и использовать среднее значение.
Вот почему такие инструменты, как google benchmark , вероятно, являются вашей лучшей ставкой.

видео с CPPCon
Также доступно в прямом эфире онлайн

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...