C++ 短函数c+的执行时间+;
我想计算一个非常小的函数的执行时间来比较递归函数和迭代函数的执行时间 当然,C++ 短函数c+的执行时间+;,c++,time,execution,C++,Time,Execution,我想计算一个非常小的函数的执行时间来比较递归函数和迭代函数的执行时间 当然,clock()在没有足够分辨率的情况下无法做到这一点。您能告诉我如何使用其他时间源,如GetThreadTimes()。我在微软的网站上看到了一个描述,但没有抓住原则 另外,标题在MS Visual 10中不起作用 守则: int search (int a[], int size, int& num) { if (size >0) { if (a[size-1] == 17) {num = s
clock()
在没有足够分辨率的情况下无法做到这一点。您能告诉我如何使用其他时间源,如GetThreadTimes()
。我在微软的网站上看到了一个描述,但没有抓住原则
另外,
标题在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();
}
int搜索(int a[],int size,int&num){
如果(大小>0){
如果(a[size-1]==17){num=size-1;返回num;}
else{return search(a,--size,num);}
else{returnnum=-1;};
}
int searchit(int a[],int size,int&num){
对于(int i=0;i cout只需进行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;
开始、结束、总计的时间;
常数int迭代=100;
开始=时钟();
对于(int i=0;i只需进行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;
开始、结束、总计的时间;
常数int迭代=100;
开始=时钟();
对于(inti=0;i一个解决方案是按照@amchacon的建议进行多次迭代。这具有简单明了的优点
它的缺点是可能导致不准确或不正确的结果,这是由于编译器使用不同的启发式进行内联和/或指令流水线,以及由于指令和数据缓存在第一次迭代后都已预热。
因此,虽然由于内存访问模式不好,函数的性能可能确实很差(可能会导致24次缓存未命中,每次都要花费500个周期),但如果缓存线的总集合适合缓存,那么当您运行函数100次时,这可能根本不会显示出来
有哪些备选方案?
a) 不适用于您的问题(因为您想测试递归算法),但我还是会在“一般”情况下说明它:Use。它是专门为微基准测试一小部分代码,直到指令而设计的
b) 使用精度更高的计时器或使用根本不是计时器的计时器。为此,您可以在Windows下使用QueryPerformanceCounter
和QueryThreadCycleTime
(Vista和更高版本)。根据您要测量的内容,周期可能比时间更可取
c) 查询。我认为这是最好的方式,因为您可以获得可靠、精确、准确的时间(与计时器不同,计时器可能包括上下文切换和在其他进程中花费的时间!),它适用于任何类型的代码,允许您在代码调用系统函数时区分内核时间和用户时间,并区分CPU时间和墙时间。
在运行函数之前和之后分别调用GetThreadTimes
一次,并减去相应的UserTime
和KernelTime
值。
或者,如果您也对墙时间感兴趣,则启动一个工作线程(对于墙时间,您将从ExitTime
中减去CreationTime
,并且显然只有在线程退出后才能获得有效的ExitTime
)。如果您的代码还涉及阻塞I/O操作,则计算墙时间可能很有用。一种解决方案是按照@amchacon的建议进行多次迭代。这具有简单明了的优点
它的缺点是可能导致不准确或不正确的结果,这是由于编译器使用不同的启发式进行内联和/或指令流水线,以及由于指令和数据缓存在第一次迭代后都已预热。
因此,虽然由于内存访问模式不好,函数的性能可能确实很差(可能会导致24次缓存未命中,每次都要花费500个周期),但如果缓存线的总集合适合缓存,那么当您运行函数100次时,这可能根本不会显示出来
有哪些备选方案?
a) 不适用于您的问题(因为您想测试递归算法),但我还是会在“一般”情况下说明它:Use。它是专门为微基准测试一小部分代码,直到指令而设计的
b) 使用精度更高的计时器或使用根本不是计时器的计时器。为此,您可以在Windows下使用QueryPerformanceCounter
和QueryThreadCycleTime
(Vista和更高版本)。根据您要测量的内容,周期可能比时间更可取
c) 查询。我认为这是最好的方式,因为您可以获得可靠、精确、准确的时间(与计时器不同,计时器可能包括上下文切换和在其他进程中花费的时间!),它适用于任何类型的代码,允许您在代码调用系统函数时区分内核时间和用户时间,并区分CPU时间和墙时间。
在运行函数之前和之后分别调用GetThreadTimes
一次,并减去相应的UserTime
和KernelTime
值。
或者,如果您也对墙时间感兴趣,则启动一个工作线程(对于墙时间,您将从ExitTime
中减去CreationTime
,并且显然只有在线程退出后才能获得有效的ExitTime
)。如果您的代码还涉及阻止I/O操作,则计算墙时间可能会很有用。您希望毫秒的分辨率更深多少?尝试使用多个执行操作执行GetTickCount是否确定您没有过早地进行微优化?执行完整函数所用的时间您希望毫秒的分辨率更深多少?请尝试Ge具有多个ex的tTickCount