Мне сложно понять время процессора. Результатом этой программы:Почему время процессора различно при каждом выполнении этой программы?
#include <iostream>
#include <chrono>
// the function f() does some time-consuming work
void f()
{
volatile long double d;
int size = 10000;
for(int n=0; n<size; ++n)
for(int m=0; m<size; ++m)
d = n*m;
}
int main()
{
std::clock_t start = std::clock();
f();
std::clock_t end = std::clock();
std::cout << "CPU time used: "
<< (end - start)
<< "\n";
}
Кажется случайным образом колебаться в пределах 210 000, 220 000 и 230 000. Сначала я был поражен, почему эти дискретные значения. Затем я узнал, что std::clock()
возвращает только approximate processor time. Поэтому, вероятно, значение, возвращаемое std::clock()
, округляется до кратного 10 000. Это также объясняет, почему максимальная разница между временами ЦП составляет 20 000 (10 000 = ошибка округления по первому вызову std::clock()
и 10 000 вторым).
Но если я перейду на int size = 40000;
в теле f()
, я получаю колебания в диапазонах от 3 400 000 до 3 500 000, которые не могут быть объяснены округлением.
Из того, что я читал о clock rate, в Википедии:
ЦП требует определенное количество тактов (или тактов) для выполнения каждой инструкции. Чем быстрее часы, тем больше команд может выполнять процессор в секунду.
То есть, если программа является детерминированным (я надеюсь, что у меня это), процессорное время, необходимо, чтобы закончить должно быть:
- Всегда же
- Чуть выше, чем количество инструкций проведено
Мои эксперименты не показывают ни того, что моя программа должна выполнять не менее 3 * size * size
инструкций. Не могли бы вы объяснить, что я делаю неправильно?
Результаты программы могут быть детерминированными, но их время выполнения не является, поскольку на вашем поле, вероятно, есть другие вещи. –
ваш код не работает в идеальной изоляции ни с чем другим в слове. Теоретически, на полпути через эту тривиальную программу, весь ад мог сломать прекращение казни в течение нескольких столетий. – thecoshman
У вас есть упрощенные ожидания относительно того, как (а) компьютеры и (б) работают операционные системы, работающие во времени. –