C++中毫秒级准确基准测试?

7

我不想使用性能分析,因为我想对不同的简单函数进行多个小型基准测试。但我却找不到一种在C++中记录毫秒数的方法,顺便说一下,我正在使用Linux。

你能否建议一种获取系统时钟毫秒数(如果找不到简单的方法,我可以接受秒数)的方法,以及它们所包含的头文件?


可能是重复问题:https://dev59.com/R3VC5IYBdhLWcg3wZwNT - Wok
2个回答

20

我使用来自sys/time.h头文件的gettimeofday函数,使用以下类:

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

class Timer
{
    timeval timer[2];

  public:

    timeval start()
    {
        gettimeofday(&this->timer[0], NULL);
        return this->timer[0];
    }

    timeval stop()
    {
        gettimeofday(&this->timer[1], NULL);
        return this->timer[1];
    }

    int duration() const
    {
        int secs(this->timer[1].tv_sec - this->timer[0].tv_sec);
        int usecs(this->timer[1].tv_usec - this->timer[0].tv_usec);

        if(usecs < 0)
        {
            --secs;
            usecs += 1000000;
        }

        return static_cast<int>(secs * 1000 + usecs / 1000.0 + 0.5);
    }
};
例如:
#include <iostream>
#include <string>
#include <sstream>

int main()
{
    Timer tm;
    std::ostringstream ooo;
    std::string str;

    tm.start();
    for(int i = 0; i < 10000000; ++i)
    {
        ooo << "This is a string. ";
    }
    tm.stop();
    std::cout << "std::ostingstream -> " << tm.duration() << std::endl;

    tm.start();
    for(int i = 0; i < 10000000; ++i)
    {
        str += "This is a string. ";
    }
    tm.stop();
    std::cout << "std::string -> " << tm.duration() << std::endl;
}

wok:可能是四舍五入,以帮助强制转换为整数,因此 999 向下舍入到一而不是零。 - John
@PC2st:那是我第一次完全“理解”代码的含义,这对我非常有帮助。我曾经在PHP中进行基准测试,但是它不太准确,无法衡量算法。非常感谢。 - John
@wok:John说,使用+0.5进行四舍五入是因为要对结果进行四舍五入,但如果结果的符号为负,则必须使用-0.5而不是+0.5 - Sadeq

7
如果您使用的是x86 CPU,您可以使用rdtsc汇编指令http://en.wikipedia.org/wiki/Rdtsc来获取在执行两个(或多个)命令之间的CPU时钟数。 但是: 1. 所有rdtsc命令应该在同一个CPU核心上运行(如果您有多核CPU)。 2. CPU应该以恒定的时钟频率运行(CPU功率管理应该被禁用)。

一个有趣的想法,谢谢。很抱歉我不能点赞,没有登录。 - John
1
有些电脑可以跨核心工作,而其他电脑则会相差数百毫秒。对于有缺陷的固件,在启动时旋转两个核心绑定线程以获取{core1-clocks,core2-clocks,core1-clocks ...},每个线程在看到另一个线程完成相同操作后立即写入其值。在我的电脑上,将核心与核心之间的差异缩小到了约400个3GHz周期。然后,要获取每个时间戳,需要使用CPUID(1)/ RDTSC / CPUID(2),如果两个CPUID指令报告不同的核心,则需要旋转。 - user433534

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接