2015-10-25 2 views
1

Я хотел бы узнать, сколько времени занимает функция C++ в миллисекундах.Время функции в C++

Вот что у меня есть:

#include<iostream> 
#include<chrono>   
using timepoint = std::chrono::steady_clock::time_point; 

float elapsed_time[100]; 

// Run function and count time 
for(int k=0;k<100;k++) { 

    // Start timer 
    const timepoint clock_start = chrono::system_clock::now(); 

    // Run Function 
    Recursive_Foo(); 

    // Stop timer 
    const timepoint clock_stop = chrono::system_clock::now(); 

    // Calculate time in milliseconds 
    chrono::duration<double,std::milli> timetaken = clock_stop - clock_start; 
    elapsed_time[k] = timetaken.count(); 
} 

for(int l=0;l<100;l++) { 
    cout<<"Array: "<<l<<" Time: "<<elapsed_time[l]<<" ms"<<endl; 
} 

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

Array: 0 Time: 0 ms 
Array: 1 Time: 0 ms 
Array: 2 Time: 15.6 ms 
Array: 3 Time: 0 ms 
Array: 4 Time: 0 ms 
Array: 5 Time: 0 ms 
Array: 6 Time: 15.6 ms 
Array: 7 Time: 0 ms 
Array: 8 Time: 0 ms 

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

EDIT

Может быть, люди предполагают, используя high_resolution_clock или steady_clock, но все три дают одинаковые результаты нерегулярные.

Это решение, по-видимому, дает реальные результаты: How to use QueryPerformanceCounter?, но мне непонятно почему. Кроме того, https://gamedev.stackexchange.com/questions/26759/best-way-to-get-elapsed-time-in-miliseconds-in-windows работает хорошо. Кажется, это проблема с реализацией Windows.

+0

Попробуйте 'steady_clock' или' high_resolution_clock' вместо этого. Степень детализации 'system_clock' может быть недостаточной. – Rostislav

+0

Да, я пробовал все 3 одинаковых результата. Я предполагаю, что это проблема многопоточности, хотя трудно указать точку. Я также пробовал передать time_point функции и когда функция заканчивается, возвращая разницу, но это тоже не работает. – OrdinaryHuman

+0

@OrdinaryHuman Возможно, это как работает ваша функция? Вы пытались измерить сон? ех. 'std :: this_thread :: sleep_for (std :: chrono :: milliseconds (15000));' – marcinj

ответ

3

Microsoft имеет приятный, чистый раствор в микросекундах, с помощью: MSDN

#include <windows.h> 

LONGLONG measure_activity_high_resolution_timing() 
{ 
    LARGE_INTEGER StartingTime, EndingTime, ElapsedMicroseconds; 
    LARGE_INTEGER Frequency; 

    QueryPerformanceFrequency(&Frequency); 
    QueryPerformanceCounter(&StartingTime); 

    // Activity to be timed 

    QueryPerformanceCounter(&EndingTime); 
    ElapsedMicroseconds.QuadPart = EndingTime.QuadPart - StartingTime.QuadPart; 


    // 
    // We now have the elapsed number of ticks, along with the 
    // number of ticks-per-second. We use these values 
    // to convert to the number of elapsed microseconds. 
    // To guard against loss-of-precision, we convert 
    // to microseconds *before* dividing by ticks-per-second. 
    // 

    ElapsedMicroseconds.QuadPart *= 1000000; 
    ElapsedMicroseconds.QuadPart /= Frequency.QuadPart; 
    return ElapsedMicroseconds.QuadPart; 
} 
+0

Я только что протестировал его, и он работает как шарм. Я сделал небольшое редактирование, чтобы предоставить образец кода с требуемым файлом заголовка: он не был включен по умолчанию в мой проект VS (вероятно, потому, что я повторно использовал проект консольного приложения), и документация MSDN неясна в этом вопросе. –

+1

@ DanielStrul спасибо! – OrdinaryHuman

2

Профильный код с использованием таймера высокого разрешения, а не системных часов; который, как вы видите, имеет очень ограниченную детализацию.

http://www.cplusplus.com/reference/chrono/high_resolution_clock/

typedef tp high_resolution_clock::time_point 

const tp start = high_resolution_clock::now(); 
// do stuff 
const tp end = high_resolution_clock::now(); 
+0

Спасибо. Я попробовал, но high_resolution_clock, system_clock и stable_clock, похоже, создают одинаковые нерегулярные результаты, причем большинство сообщений 0s. – OrdinaryHuman

+0

@OrdinaryHuman Посмотрите на членов 'high_resolution_clock :: time_point', может быть, ваш код игнорирует значения более высокого разрешения? – Dai

0

Если вы подозреваете, что какой-либо другой процесс или поток в приложении занимает слишком много процессорного времени, то используйте:

GetThreadTimes под окнами

или

clock_gettime с CLOCK_THREAD_CPUTIME_ID под linux

для измерения тем времени процессора, выполняемого вашей функцией. Это исключает из ваших измерений время, когда во время профилирования выполнялись другие потоки/процессы.

+0

Да, я думаю, вы на что-то. Я попробовал http://stackoverflow.com/questions/1739259/how-to-use-queryperformancecounter и, похоже, вернул реальные результаты. – OrdinaryHuman

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