在C ++中执行部分代码的时间

时间:2012-06-25 22:32:51

标签: c++ performance

如何计算在C ++中执行部分代码的时间(以MS为单位)?

3 个答案:

答案 0 :(得分:2)

大多数系统都支持高性能计时机制。在Windows上,您可以使用高性能计时器API:

QueryPerformanceFrequency

QueryPerformanceCounter

在* nix系统上,您可以使用clock_getres() and clock_gettime()

您应该能够弄清楚如何使用这些来为代码计时。

答案 1 :(得分: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_pointduration的类,可以使作业更简单,更清晰。但是,这些都不能保证毫秒级的精度(甚至精度)。新类的typedef持续时间低至纳秒范围,但无法保证您的实际结果是否准确(但对于大多数典型的操作系统,我很确定答案通常是“不”)。

答案 2 :(得分: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();