2016-07-11 4 views
-2

Я хочу сравнить цикл for. Я решил увеличить эту переменную в цикле for на 100 и соответствующим образом измерить время.Бенчмаркинг (время выполнения цикла for): не следует ли иметь монотонную возрастающую функцию с увеличением предела цикла for

#include <cstdio> 
#include <ctime> 
#include <time.h> 
#include <iostream> 
#include <random> 
#include <iomanip>  // std::setprecision 
using namespace std; 

double difference(timespec start, timespec end); 

int main() 
{ 
    timespec time1, time2; 

    for(int limit = 0; x < 100000; limit+= 100) 
    { 
     clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1); 
     int temp = 0; 
     for (int i = 0; i< limit; i++) 
     temp+=temp; 

     clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2); 
     std::cout << std::fixed; 
     std::cout << std::setprecision(5); 
     cout<<x <<" " << difference(time1,time2)<<endl; 
    } 

    return 0; 
} 

double difference(timespec start, timespec end) 
{ 
    timespec temp; 
    if ((end.tv_nsec-start.tv_nsec)<0) { 
     temp.tv_sec = end.tv_sec-start.tv_sec-1; 
     temp.tv_nsec = 1000000000+end.tv_nsec-start.tv_nsec; 
    } else { 
     temp.tv_sec = end.tv_sec-start.tv_sec; 
     temp.tv_nsec = end.tv_nsec-start.tv_nsec; 
    } 
    return (temp.tv_sec + temp.tv_nsec)/1000000000.00; 
} 

График

Ось ординат представляет время в секундах, ось х представляет собой возрастающую предел итерации.

Гипотеза: с увеличением предела время должно увеличиваться. Мы должны иметь строго возрастающую функцию

curvse показывает otherswise. Зачем нужно 0.00001 секунд до цикла 5300 раз и 0.00002 секунд до цикла 5400 раз. Как вы можете видеть на графике, есть много раз, когда у нас есть эта вещь.

enter image description here

+10

Здесь так много ошибок, что я даже не знаю, с чего начать. 1) Вероятно, вы компилируете с отключением оптимизации. В противном случае это будет плоская линия вблизи нуля из-за DCE. 2) Подписанное целочисленное переполнение - UB. Хотя это обычно безобидно, некоторые компиляторы (а именно GCC), как известно, делают с ним неожиданные вещи. 3) Ваша контрольная петля слишком мала, чтобы иметь смысл. Для меньших пределов времени требуется больше времени, чем для запуска цикла. – Mysticial

+3

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

ответ

6

Гипотеза:

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

С увеличением предела время должно увеличиваться. Мы должны иметь строго возрастающая функция

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

Артефакты на кривой легко объясняются конечным разрешением часов: он явно не может измерять разницу во времени меньше 1e-5; вариации, меньшие, чем 1е-5, ​​будут показаны как плоские линии или дискретные изменения 1е-5.

2

Вы можете ясно видеть шаги в кривой, которая означает, что вы попали в точности стены в вашем измерении. Другими словами, вызов clock_gettime просто не мог дать вам более точные значения, и несколько итераций измеряли одно и то же значение времени, потому что между прогонами просто нет существенной разницы.

Маленькие пики и долины можно объяснить ошибками округления. Один раз вы позвонили clock_gettime прямо перед часами «tick», и в следующий раз он был вызван сразу после «отметки». Это может привести к тому, что первый раз будет выглядеть короче одним «тиком». Здесь «тик» - это точность часов.

 Смежные вопросы

  • Нет связанных вопросов^_^