计算CPU滴答

时间:2015-05-28 00:27:43

标签: c++ singleton

我正在建立一个项目,在速度方面比较单身人士的一些方法。

我尝试做的是要求用户输入他们想要运行每种方法的次数,循环它们并计算CPU滴答。

问题是CPU厚度都是0.我该怎么办?

这是我的代码:

int numOfCalls;
cout << "How many calls do you want for each?";
cin >> numOfCalls;
clock_t beg, end;
beg = clock();
for (size_t i = 0; i != numOfCalls; i++)
    Object* p = GofFixed::instance_GofFixed();
end = clock();
cout << (beg-end) / CLOCKS_PER_SEC << endl;
beg = clock();
for (size_t i = 0; i != numOfCalls; i++)
    Boost::instance_Boost();
end = clock();
cout << (beg - end) / CLOCKS_PER_SEC << endl;

1 个答案:

答案 0 :(得分:3)

标准允许clock_t为整数类型。如果是,那么它受整数除法规则的约束。看起来您的基准测试可能会在不到一秒的时间内完成。如果是,则(beg - end) / CLOCKS_PER_SECOND将产生小于1的结果,然后将其截断为0.

更好的时间方法是使用std::chrono::high_resolution_clock。然后,您可以转换为标准库支持的任何时间单位。最好使用较小的时间单位,以便保持亚秒级测量。使用chrono会将您的代码更改为:

auto beg = std::chrono::high_resolution_clock::now();
for (size_t i = 0; i != numOfCalls; i++)
    Object* p = GofFixed::instance_GofFixed();
auto end = std::chrono::high_resolution_clock::now();
cout << std::chrono::duration_cast<std::chrono::milliseconds>(beg - end).count() << endl;
                                           //   ^^^^^^^^^^^^ Used milliseconds instead
                                           //                for greater accuracy

如果基准测试没有优化或者不会花费不到一毫秒,那么哪个应该有效。

您可以在std::chrono::high_resolution_clock herestd::chrono::duration_cast here上阅读更多内容。