在C ++中重复计时void函数

时间:2015-11-19 07:56:24

标签: c++ optimization void-pointers benchmarking

我正在尝试计算一个无效函数

for (size_t round = 0; round < 5; round++) {
    cpu_time_start = get_cpu_time();
    wall_time_start = get_wall_time();

    scan.assign_clusters(epsilon, mu);

    cpu_time_end = get_cpu_time();
    wall_time_end = get_wall_time();
    ...
}

第一个时间产生300秒,而接下来的四个时间产生0.000002秒。这表明对assign_clusters的void函数调用已经过优化。如何强制我的程序每次执行这个耗时的函数调用,但仍然使用优化代码的其余部分?

我通常做的是保存有问题的函数的结果然后打印它,但由于这是一个void函数,我是否有相同的选项?

我使用以下优化标记:-std=c++0x -march=native -O2

1 个答案:

答案 0 :(得分:2)

这取决于花时间做出修复。

这可能是由以下原因引起的: -

  1. 加载服务。您的群集可能是基于数据库的,并且需要数据库服务启动(第一次)
  2. 磁盘缓存。操作系统将记住它已读取的数据,并能够像在内存中一样提供数据。
  3. 内存缓存。 CPU具有不同的可用内存速度,使用相同的内存两次,第二次会更快。
  4. 状态缓存。对于后续运行,数据可能处于更适合的状态。这可以被认为是对数组进行两次排序。第二次已经排序,这可以加快速度。
  5. 服务启动可以是几秒钟。

    磁盘缓存加速约20倍。 内存缓存大约加快6倍 状态缓存,可以是无限的。

    我认为您的代码需要重置扫描对象,以确保它再次完成工作