短函数c++的执行时间
Execution time of a short function c++
我想计算一个非常小的函数的执行时间,以比较递归函数和迭代函数的执行速度。
毫无疑问,clock()
在没有足够分辨率的情况下根本无法做到这一点。你能告诉我如何使用像GetThreadTimes()
这样的其他时间源吗。我在微软网站上看到了一个描述,但没有领会其中的原理。
此外,<chrono>
标头在MS Visual 10中不起作用。
代码:
int search (int a[], int size, int& num) {
if (size >0) {
if (a[size-1] == 17) {num = size-1; return num;}
else {return search (a, --size, num);}}
else {return num=-1;};
}
int searchit (int a[], int size, int& num) {
for (int i =0; i< size; i++) {
if (a[i] == 17) {num = i;}
else num = -1;
}
return num;}
int main () {
srand ((unsigned int) time(0));
int num = 0;
const int size = 40;
int a[size];
for (int i =0; i< size; i++) {
a[i] = rand()%100;
cout << a[i] << endl;}
cout << 'n';
search (a, size, num);
cout << num << endl;
cin.get();
cin.ignore();
}
一个解决方案是按照@amchacon的建议进行多次迭代。这具有简单明了的优点。
它的缺点是,由于编译器使用不同的启发式方法进行内联和/或指令流水线,以及由于指令和数据缓存在第一次迭代后都已预热,因此可能导致不准确或不正确的结果
因此,尽管由于内存访问模式不好(可能导致20多个缓存未命中,每个缓存会花费500个周期),您的函数的性能可能确实很差,但如果总的缓存线集适合缓存,那么当您运行该函数一百次时,这可能根本不会显示出来。
有哪些替代方案
a) 不适用于您的问题(因为您想测试递归算法),但我无论如何都会为"一般"情况声明:使用IACA。它是专门为微观基准测试而设计的,从一小段代码一直到指令。
b) 使用更高精度的计时器或使用根本不是计时器的计时器。为此,您可以在Windows下使用QueryPerformanceCounter
和QueryThreadCycleTime
(Vista及更高版本)。周期可能比时间更可取,这取决于您想要测量的内容。
c) 查询线程时间。在我看来,这是最好的方法,因为你可以获得可靠、精确、准确的时间(与计时器不同,计时器可能包括上下文切换和在其他进程中花费的时间!),它适用于任何类型的代码,让你在代码调用系统函数时区分内核和用户时间,并区分CPU和墙时间
在运行函数之前和之后调用GetThreadTimes
一次,并减去相应的UserTime
和KernelTime
值
或者,如果您也对墙时间感兴趣,则启动一个工作线程(对于墙时间,您将从ExitTime
中减去CreationTime
,并且显然只有在线程退出后才能获得有效的ExitTime
!)。如果您的代码还涉及到阻塞I/O操作,那么计算墙时间可能会很有用。
只需进行100次搜索并取平均值:
time_t begin,end,total;
const int iterations = 100;
begin = clock();
for (int i = 0;i<iterations;i++)
search (a, size, num);
end = clock();
total = (end-begin)/static_cast<double>(CLOCKS_PER_SEC);
cout<<"Average time for "<<iterations<<" iterations: "<<total/iterations<<endl;
编译器将展开循环:)。无论如何,For循环的消耗是可以忽略不计的。
- 简单C++"Hello World"程序的执行时间长
- 我使用 OpenMP 的线程越多,执行时间就越长,这是怎么回事?
- 为什么切换 for 循环的顺序会显著改变执行时间?
- cmd.exe与Powershell中C++程序的不同执行时间
- pthread执行时间比顺序执行时间差
- OpenCV 函数 cv::remap() 的执行时间更长,当程序在两者之间进入睡眠状态时
- 为什么 std::chrono 在测量循环和编译器优化的并行 OpenMP 的执行时间时不起作用?
- 我需要帮助来缩短检索 SSL 证书的执行时间
- 如何测量cudaMalloc执行时间
- c++中的执行时间和检查流状态
- 为什么for循环中的异步不能提高执行时间
- 为什么 C++ openMP 程序执行时间更长
- 测量任何 Windows 可执行文件的内存使用情况和执行时间
- 需要减少我的C++代码的执行时间
- 如何在 ubuntu 上的 php 脚本中获取程序(c,c++,java,python,php)的执行时间和内存使用量?
- 在Qt中设置pixmap时的执行时间很奇怪
- 异步控制线程执行时间
- 如何对 g++ 设置执行时间限制?
- 测量 std::系统的实际执行时间(以 C++ 为单位)
- 视觉在C 中获取每行代码的执行时间