您如何计算在 C++ 中执行部分代码的时间(以 MS 为单位)?
问问题
306 次
3 回答
2
大多数系统都支持高性能计时机制。在 Windows 上,您可以使用高性能计时器 API:
在 *nix 系统上,您可以使用clock_getres() and clock_gettime()
.
您应该能够弄清楚如何使用它们来计时您的代码。
于 2012-06-25T22:39:50.483 回答
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
可以使工作更简单、更清晰。然而,这些都不能保证毫秒级的准确性(甚至精度)。新类的 typedef 持续时间低至纳秒范围,但不能保证您的实际结果是否准确(但对于大多数典型的操作系统,我很确定答案通常是“不”)。
于 2012-06-25T22:43:15.760 回答
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();
于 2012-06-25T22:44:14.990 回答