2012-06-25 5 views
-4

Как вы вычисляете время (в MS) выполнения части кода в C++?Время выполнения части кода в C++

+0

Либо использовать профайлер или вставить вызовы функции таймера до/после секции кода интереса. –

+6

-1 за отсутствие исследовательских усилий. –

+0

'' отлично работает, если у вас есть C++ 11. Это может быть немного сложно понять, если вы никогда не использовали его, но это не плохо, как только вы пойдете. – chris

ответ

2

О лучшем, что вы можете сделать в переносном коде, - это время с clock().

clock_t start = clock(); 
// code to time goes here 
clock_t stop = clock(); 

double seconds = double(stop-start)/CLOCKS_PER_SEC; 

C++ 11 добавляет новый заголовок с именем <chrono> с классами для time_point и duration, которые могут сделать работу проще и чище. Однако ни одно из них не гарантирует точность на миллисекундах (или даже точность). Новые классы имеют typedefs для продолжительности вплоть до наносекундного диапазона, но не гарантируют, будут ли ваши реальные результаты такими точными или нет (но с большинством типичных ОС, я уверен, что ответ обычно «не»).

+0

Я бы не сидел «лучше». Вам будет лучше «# ifdef» в отношении конкретных функций ОС, так как «clock()» может иметь довольно низкое разрешение. –

+0

'# ifdef. Функции, специфичные для ОС, (по определению) не являются переносимым кодом. Разрешение 'clock' меняется, но, конечно, * может быть довольно низким. Для портативного кода это все равно самое лучшее, что вы можете сделать. Они на самом деле не предназначены для этой цели, но могут быть применены к этому использованию в любом случае. –

+0

Хорошо, но на практике это приводит к созданию кода, который отлично работает и имеет лучшую возможность измерять небольшие промежутки времени. Но да, это не технически переносимо, поскольку оно нестандартно. –

2

Большинство систем поддерживают высокопроизводительный механизм синхронизации. В Windows вы можете использовать таймер API высокой производительности:

QueryPerformanceFrequency

QueryPerformanceCounter

В * NIX системах вы можете использовать clock_getres() and clock_gettime().

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

0

Вот что я использую для C++ (не 11), но многие библиотеки могут иметь более сложные решения. Для кода вам нужен Qt, но его можно легко обойти. Возможно, вам также потребуется заменить CLOCK_MONOTONIC в зависимости от вашей операционной системы.

#ifndef PROFILER_H 
#define PROFILER_H 

#include <sys/time.h> 
#include <QString> 

class Profiler 
{ 
    public: 
    Profiler(QString const& name); 
    long measure() const; 

    long measureNs() const; 
    double measureMs() const; 
    double measureS() const; 
    void printNs() const; 
    void printMs() const; 
    void printS() const; 
    private: 
    QString mName; 
    timespec mTime; 
}; 

#endif // PROFILER_H 

#include "profiler.h" 
#include <QDebug> 
#include <assert.h> 
#include <iostream> 

Profiler::Profiler(QString const& name):mName(name){ 
    clock_gettime(CLOCK_MONOTONIC, &mTime); // Works on Linux 
} 


long int Profiler::measureNs() const{ 
    timespec end; 
    clock_gettime(CLOCK_MONOTONIC, &end); // Works on Linux 
    long int diff = (end.tv_sec-mTime.tv_sec) * 1000000000 + (end.tv_nsec - mTime.tv_nsec); 
    assert(diff>0); 
    return diff; 
} 

double Profiler::measureMs() const{ 
    return measureNs()/1000000.0; 
} 

double Profiler::measureS() const{ 
    return measureMs()/1000.0; 
} 

void Profiler::printNs() const{ 
    qDebug() << mName << "Time elapsed:" << measureNs() << "ns"; 
} 

void Profiler::printMs() const{ 
    qDebug() << mName << "Time elapsed:" << measureMs() << "ms"; 
} 

void Profiler::printS() const{ 
    qDebug() << mName << "Time elapsed:" << measureS() << "S"; 
} 

Использование:

Profiler pro("Tag you want"); 
function(); 
pro.printMs(); 
Смежные вопросы