C++ 如何评估计划';什么是运行时间?

C++ 如何评估计划';什么是运行时间?,c++,profile,C++,Profile,我开发了一个简单的程序,想在一台真正的机器上评估它的运行时性能,例如我的MacBook。 源代码如下: #include <stdio.h> #include <vector> #include <ctime> int main () { auto beg = std::clock () ; for (int i = 0; i < 1e8; ++ i) { } auto end = std::clock () ;

我开发了一个简单的程序,想在一台真正的机器上评估它的运行时性能,例如我的MacBook。 源代码如下:

#include <stdio.h>
#include <vector>
#include <ctime>

int main () {
    auto beg = std::clock () ;
    for (int i = 0; i < 1e8; ++ i) {

    }
    auto end = std::clock () ;
    printf ("CPU time used: %lf ms\n", 1000.0*(end-beg)/CLOCKS_PER_SEC) ;
}
“[a,b):n”表示同一程序的实际运行时间在a ms和b ms之间,持续n次

很明显,真实的运行时变化很大,而且似乎不是正态分布。有人能告诉我是什么原因导致这种情况,以及我如何正确评估运行时吗


感谢您回答这个问题。

基准测试很难

简短回答:使用

长答覆: 有很多事情会影响时间安排

  • 调度(运行其他东西而不是您的操作系统)
  • CPU扩展(操作系统决定它可以通过运行较慢来节省能源)
  • 内存争用(需要时使用内存的其他内容)
  • 总线争用(与您想要对话的设备对话的其他内容)
  • 缓存(CPU保留一个值以避免使用内存)
  • CPU迁移。(操作系统将您从一个CPU迁移到另一个CPU)
  • 时钟不准确(只有CPU时钟在任何程度上都是准确的,但如果迁移,它们会发生变化)
避免这些影响的唯一方法是禁用CPU缩放,执行“缓存刷新”功能(通常在启动前只需接触大量内存),以高优先级运行,并将自己锁定到单个CPU。即使如此,您的计时仍然会很嘈杂,所以最后一件事就是重复很多次,并使用平均值。
这就是为什么像这样的工具可能是你最好的选择



也可现场使用

基准测试很难

简短回答:使用

长答覆: 有很多事情会影响时间安排

  • 调度(运行其他东西而不是您的操作系统)
  • CPU扩展(操作系统决定它可以通过运行较慢来节省能源)
  • 内存争用(需要时使用内存的其他内容)
  • 总线争用(与您想要对话的设备对话的其他内容)
  • 缓存(CPU保留一个值以避免使用内存)
  • CPU迁移。(操作系统将您从一个CPU迁移到另一个CPU)
  • 时钟不准确(只有CPU时钟在任何程度上都是准确的,但如果迁移,它们会发生变化)
避免这些影响的唯一方法是禁用CPU缩放,执行“缓存刷新”功能(通常在启动前只需接触大量内存),以高优先级运行,并将自己锁定到单个CPU。即使如此,您的计时仍然会很嘈杂,所以最后一件事就是重复很多次,并使用平均值。
这就是为什么像这样的工具可能是你最好的选择



也可现场使用

对不起,我是用g++编译的,而不是GCC,这在很大程度上取决于您的系统有多忙。我确实希望在其他空闲系统上会有较低的偏差。您可以尝试使用
nice-n-10
调用进程,以提高调度优先级,并查看这是否有影响。我在本地(linux)测试了您的程序99%的测试在0.5毫秒的时间间隔内。没有测试在10毫秒的时间间隔外。@Scheff,默认优化级别(
-O0
)for循环似乎没有优化。OP使用默认优化级别。@Scheff是的,默认优化级别是-O0,而for循环没有优化。对不起,我是用g++编译的,而不是GCC,这在很大程度上取决于您的系统有多忙。我确实希望在其他空闲的系统上偏差较小。您可以尝试调用pr使用
nice-n-10
进行处理,以提高调度优先级,并查看这是否有影响。我在本地(linux)测试了您的程序,99%的测试在0.5ms的时间间隔内。没有测试在10ms的时间间隔外。@Scheff,默认优化级别(
-O0
)for循环似乎没有优化。OP使用默认优化级别。@Scheff是的,默认优化级别为-O0,而for循环没有优化。平均值不一定是最佳值。例如,中位数允许对绑定的工件进行排序。也要考虑最低值,因为干扰较少(即使运行之间的可复制性/可比性较差)@Jarod42:。你总是可以争论哪种平均值最好,这主要取决于你使用它的目的。但除了方差之外,几乎不可能删除。平均值不是最好的。例如,中位数允许对绑定的工件进行排序。也要考虑最低值,因为干扰较少(即使运行之间的可复制性/可比性较低)。@Jarod42:。你总是可以争论哪种平均值最好,这主要取决于你使用它的目的。但除了方差之外,几乎不可能消除。
[130.000000, 136.000000): 0
[136.000000, 142.000000): 1
[142.000000, 148.000000): 234
[148.000000, 154.000000): 116
[154.000000, 160.000000): 138
[160.000000, 166.000000): 318
[166.000000, 172.000000): 139
[172.000000, 178.000000): 40
[178.000000, 184.000000): 11
[184.000000, 190.000000): 3