2015-09-03 3 views
0

Я использовал следующую функцию, чтобы найти время, затраченное моим кодом.Время записи по коду

#include <sys/time.h> 
    struct timeval start, end; 
    gettimeofday(&start,NULL); 
    //mycode 
    gettimeofday(&end,NULL); 
    cout<<" time taken by my code: "<<((end.tv_sec - start.tv_sec) * 1000000 + end.tv_usec - start.tv_usec)/1000.0<<" msec"<<endl; 

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

+4

Вы должны взглянуть на новый C++ 11 библиотек хроно вместо использования time.h. –

+1

Используйте профилировщик. –

+0

@ViktorSehr Уверен ... не могли бы вы привести мне пример использования chrono –

ответ

7

Мое предположение, что time_t (тип tv_sec) в системе подписан 32 бита и что (end.tv_sec - start.tv_sec) * 1000000 переполнению.

Вы могли бы проверить эту теорию, убедившись, что вы не используете 32 битную арифметику для этого вычисления:

(end.tv_sec - start.tv_sec) * 1000000LL 

Это, как говорится, я советую использовать 11 <chrono> C++ библиотеки вместо:

#include <chrono> 

    auto t0 = std::chrono::system_clock::now(); 
    //mycode 
    auto t1 = std::chrono::system_clock::now(); 
    using milliseconds = std::chrono::duration<double, std::milli>; 
    milliseconds ms = t1 - t0; 
    std::cout << " time taken by my code: " << ms.count() << '\n'; 

<chrono> библиотека имеет инвариант, что ни один из «предопределенных» длительностей будет переполнение в менее чем +/- 292 лет. На практике только nanoseconds будет быстро переполняться, а другие длительности будут иметь гораздо больший диапазон. Каждая продолжительность имеет статические функции ::min() и ::max(), которые вы можете использовать для запроса диапазона для каждого.

original proposal for <chrono> имеет достойный раздел учебника, который может быть полезным введением. Он лишь слегка устарел. То, что он называет monotonic_clock, теперь называется steady_clock. Я считаю, что это единственное значительное обновление, которое ему не хватает.

+1

Переполнение - вероятный виновник - в зависимости от того, подписан ли 'time_t' или нет, он будет проходить примерно каждые 35 или 71 минуту. Тем не менее, 1213 мс подозрительно близок к нулю, поэтому могут возникнуть другие проблемы. – MooseBoys

+0

Не было бы переполнения с помощью хронографа? –

+0

@JannatArora: Обращено в ответ. –

1

На какой платформе вы это делаете? Если это Linux/Unix, как ваша самая легкая неинтрузивная ставка, просто используйте команду time из командной строки. Является ли код, который вы используете однопоточным или нет? Некоторые из функций в time.h (например, clock(), например) возвращают количество тиков против каждого ядра, что может быть или не быть тем, что вы хотите. И новый материал в хронографе может быть не таким точным, как вам нравится (некоторое время назад я пытался измерять временные интервалы в наносекундах с помощью хронографа, но самый низкий интервал времени, который я получил назад, тогда составлял 300 нс, что было гораздо менее точным, чем я я надеялся).

0

Эта часть лавку процесса маркировки может помочь вашей цели:

#include<time.h> 
#include<cstdlib> 
... 
... 
float begin = (float)clock()/CLOCKS_PER_SEC; 
... 
//do your bench-marking stuffs 
... 
float end = (float)clock()/CLOCKS_PER_SEC; 
float totalTime = end - begin; 
cout<<"Time Req in the stuffs: "<<totalTime<<endl; 

ПРИМЕЧАНИЕ: Этот процесс является простой альтернативой хроно библиотеки

0

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

/usr/bin/time -v <your program's executable> 

Например:

/usr/bin/time -v sleep 3                       .../home/aakashah/workspace/head/src/GroverStorageCommon 
     Command being timed: "sleep 3" 
     User time (seconds): 0.00 
     System time (seconds): 0.00 
     Percent of CPU this job got: 0% 
     Elapsed (wall clock) time (h:mm:ss or m:ss): 0:03.00 
     Average shared text size (kbytes): 0 
     Average unshared data size (kbytes): 0 
     Average stack size (kbytes): 0 
     Average total size (kbytes): 0 
     Maximum resident set size (kbytes): 2176 
     Average resident set size (kbytes): 0 
     Major (requiring I/O) page faults: 0 
     Minor (reclaiming a frame) page faults: 165 
     Voluntary context switches: 2 
     Involuntary context switches: 0 
     Swaps: 0 
     File system inputs: 0 
     File system outputs: 0 
     Socket messages sent: 0 
     Socket messages received: 0 
     Signals delivered: 0 
     Page size (bytes): 4096 
     Exit status: 0 
Смежные вопросы