我正在尝试为时间测量创建一个简单的类,其中strat()将开始测量,而end()将结束它并输出结果。到目前为止我有:
#include <sys/time.h>
#include <string>
#include <iostream>
using namespace std;
class Time {
public:
Time() {strTmp.clear();}
void start(string str) {
strTmp=str;
gettimeofday(&tim, NULL);
timeTmp = tim.tv_sec+(tim.tv_usec/1000000.0);
}
void end() {
gettimeofday(&tim, NULL);
cout << strTmp << " time: " << timeTmp - tim.tv_sec+(tim.tv_usec/1000000.0) << "s" << endl;
strTmp.clear();
}
private:
double timeTmp;
string strTmp;
timeval tim;
};
int main()
{
Time t;
t.start("test");
t.end();
return 0;
}
不幸的是,测量延迟时间为1秒。 没有字符串输入,此延迟消失。 有没有办法避免延迟并仍然有字符串输入?
(我使用g ++与-std = c ++ 11 -O3进行编译)
答案 0 :(得分:0)
一个简单的字符串不应该为测试添加那么多时间(1秒?)。
无论如何,通过const引用传递字符串,而不是通过值传递。当您通过值传递时,您将产生不必要的副本:
void start(const string& str) {
另一种选择是风格 - 除了让你的输出看起来“花哨”之外,该字符串的用途是什么?为什么不摆脱它呢?另外,为什么你的班级会cout
?如果目标是封装Time
,则不需要cout - 让Time
类的客户端处理I / O.
答案 1 :(得分:0)
好像你应该将你的计时器标记字符串传递给构造函数而不是start函数。此外,在计时器正在运行时,您不应该进行此计算timeTmp = tim.tv_sec+(tim.tv_usec/1000000.0);
。等到你注册了end
被调用的时间来完成这样的单位转换之后。
答案 2 :(得分:0)
您需要记住运算符优先级:
cout << strTmp << " time: " << timeTmp - tim.tv_sec+(tim.tv_usec/1000000.0) << "s" << endl;
这是从开始时间的总和减去末尾的整个秒数,结束时的微秒数a - b + c/d
与a - ( b + c/d )
不同。正如您对@PaulMcKenzie建议的评论所示,将其更改为tim.tv_sec+(tim.tv_usec/1000000.0) - timeTmp
会产生更有意义的结果。