2015-07-15 6 views
1

Итак, я хочу измерить время некоторых функций на C++, и я пробовал много способов сделать это. Это мой окончательный код:Получить метки процессора и измеренное время

auto start = chrono::steady_clock::now(); 
clStart = clock(); 

for (int o=0; o<100;o++) 
{ 
    sin(o); 
    // Sleep(1); 
} 

auto end = chrono::steady_clock::now(); 
clEnd = clock(); 

auto difTime = end-start; 
diff = chrono::duration <double,milli> (difTime).count(); //gives me 0 
diffTicks = clEnd-clStart; //0 as well 

Он отлично работает, когда я ввожу, например, Sleep() функции внутри, но при использовании греха из math.h я всегда получаю 0 раз. Почему это? Я знаю, что это, вероятно, оптимизировано, но 0? Я хочу сравнить это с другими реализациями sin, но я не уверен, что здесь неправильно.

+2

Попробуйте с 'Int о = 0; o <100000; o ++ ' –

+0

@ Томас ... ладно, это было немым: D спасибо, похоже, что он работает btw sin действительно не занимает даже одного тика? Я думал, что часы возвращают количество тиков? – Hitokage

ответ

1

время используется для расчета 100 грех очень короткий, вы должны использовать

auto start = chrono::steady_clock::now(); 
clStart = clock(); 

for (int o=0; o<100000;o++) 
{ 
    sin(o); 
    // Sleep(1); 
} 

auto end = chrono::steady_clock::now(); 
clEnd = clock(); 

auto difTime = end-start; 
diff = chrono::duration <double,milli> (difTime).count(); 
diffTicks = clEnd-clStart; 

вместо этого.

Кроме того, ваш код измеряет миллисекунды. Я рекомендую использовать chrono::duration <double, nano> (diff).count(), которые используют наносекунду для большей точности.


Из док:.

Единственные данные, хранящиеся в длительности является счетчиком тик типа Rep Если Группа является плавающей точкой, то продолжительность может представлять фракции клещей. Период включается как часть типа продолжительности и используется только при конвертации между разными длительностями.

Это означает, что это не CPU тикает вы измеряете

+0

Спасибо, что это достаточно хорошо для меня, я думаю. – Hitokage

0

Я думаю, что лучше использовать внутренний счетчик тиков. Я обычно используют два класса, чтобы помочь мне с этим:

class PACKAGE Profiler 
{ 
    public: 
    Profiler() 
    { 
     totalTime=0; 
     PCFreq = 0.0; 
     numberOf =0.0; 
     QueryPerformanceFrequency(&li); 
     PCFreq = double(li.QuadPart)/1000.0; 

     QueryPerformanceCounter(&li); 
     CounterStart = li.QuadPart; 

    } 
    __int64 CounterStart; 
    LARGE_INTEGER li; 
    double totalTime; 
    double PCFreq; 
    long numberOf; 

}; 

class PACKAGE Profiterol 
{ 
    private: 
     Profiler* m_myprofiler; 
    public: 
    Profiterol(Profiler* a_prof) 
    { 
     m_myprofiler = a_prof; 
     QueryPerformanceCounter(&m_myprofiler->li); 
     m_myprofiler->CounterStart = m_myprofiler->li.QuadPart; 
     m_myprofiler->numberOf++; 
    } 
    ~Profiterol() 
    { 
     QueryPerformanceCounter(&m_myprofiler->li); 
     m_myprofiler->totalTime += double(m_myprofiler->li.QuadPart-m_myprofiler->CounterStart)/m_myprofiler->PCFreq; 
    } 

}; 

И затем, в вашем коде вы должны сделать это:

Profiler partial2; 

{ 
    Profiterol tmp(&partial2); 
     for (int o=0; o<100;o++) 
     { 
      sin(o); 
      // Sleep(1); 
     } 
} 
String strMeasureTime = String(partial2.totalTime) + "(" + String(partial2.numberOf) 

В strMeasureTime у вас будет время.

+1

Спасибо, я попробую это, может быть, слишком – Hitokage