时间测量类通过字符串输入减慢

时间:2014-12-02 18:49:03

标签: c++ string

我正在尝试为时间测量创建一个简单的类,其中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进行编译)

3 个答案:

答案 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/da - ( b + c/d )不同。正如您对@PaulMcKenzie建议的评论所示,将其更改为tim.tv_sec+(tim.tv_usec/1000000.0) - timeTmp会产生更有意义的结果。