【发布时间】:2015-10-25 22:58:13
【问题描述】:
我想计算一个函数在 C++ 中花费的时间(以毫秒为单位)。
这是我所拥有的:
#include<iostream>
#include<chrono>
using timepoint = std::chrono::steady_clock::time_point;
float elapsed_time[100];
// Run function and count time
for(int k=0;k<100;k++) {
// Start timer
const timepoint clock_start = chrono::system_clock::now();
// Run Function
Recursive_Foo();
// Stop timer
const timepoint clock_stop = chrono::system_clock::now();
// Calculate time in milliseconds
chrono::duration<double,std::milli> timetaken = clock_stop - clock_start;
elapsed_time[k] = timetaken.count();
}
for(int l=0;l<100;l++) {
cout<<"Array: "<<l<<" Time: "<<elapsed_time[l]<<" ms"<<endl;
}
这可以编译,但我认为多线程会阻止它正常工作。输出以不规则的间隔产生时间,例如:
Array: 0 Time: 0 ms
Array: 1 Time: 0 ms
Array: 2 Time: 15.6 ms
Array: 3 Time: 0 ms
Array: 4 Time: 0 ms
Array: 5 Time: 0 ms
Array: 6 Time: 15.6 ms
Array: 7 Time: 0 ms
Array: 8 Time: 0 ms
我需要使用某种互斥锁吗?或者有没有更简单的方法来计算函数执行所需的毫秒数?
编辑
也许人们建议使用high_resolution_clock 或steady_clock,但是这三个都会产生相同的不规则结果。
这个解决方案似乎产生了真正的结果:How to use QueryPerformanceCounter? 但我不清楚为什么。此外,https://gamedev.stackexchange.com/questions/26759/best-way-to-get-elapsed-time-in-miliseconds-in-windows 效果很好。似乎是 Windows 实现问题。
【问题讨论】:
-
改用
steady_clock或high_resolution_clock。system_clock的粒度可能不够。 -
是的,我已经尝试了所有 3 个,结果相同。我假设这是一个多线程问题,尽管很难指出。我也尝试过将 time_point 传递给函数,当函数结束时,返回差异,但这似乎也不起作用。
-
@OrdinaryHuman 也许这就是你的函数的工作原理?你试过测量睡眠吗?前任。
std::this_thread::sleep_for(std::chrono::milliseconds(15000)); -
我相信问题在于您记录的是 CPU 时间而不是挂壁时间。如果您有权访问
OpenMP,您应该能够使用函数omp_get_wtime()获取挂钟时间。我确信在您使用的任何多线程语言中都有一个等价物。一般来说system_clock()会返回 CPU 时间——不是你想要的。 -
@NoseKnowsAll 谢谢,但我不想要挂墙时间,我需要知道函数执行需要多少毫秒或微秒。测量墙上的时间会给我带来噪音——例如,如果有 15 个线程在运行,那么我的性能取决于其他获得 CPU 时间的东西。我正在寻找一个函数运行多长时间。我认为下面通过 Microsoft 提供的
QueryPerformanceCounter解决方案可能是 Windows 上唯一的方法。
标签: c++ multithreading timer mutex