假设我有一个嵌套的for循环和if-checks,如下所示,如果我想查看一个特定的for-loop或if-check要完成执行需要多少个时钟周期(大约几秒)。
内部for循环和if-check所花费的时钟周期数(秒)之和应等于(或近似等于)最外部for循环所花费的时钟周期数(秒)之和。 ?
还是我做错了?如果还有其他方法,我该如何计时循环??
注意:我有3个不同的功能几乎可以完成相同的事情,我已经声明了3个不同的功能来分别测量每个for循环或if-check,因为如果我尝试获取所有子组件的执行时间,相同的代码,则外部for循环占用的时钟周期数(秒)将包括一些额外的指令执行,这些指令正在计算内部for循环的时钟周期计数和if-check。
void fun1(){
int i=0,j=0,k=0;
clock_t t=0,t_start=0,t_end=0;
//time the outermost forloop
t_start = clock();
for(i=0;i<100000;i++){
for(j=0;j<1000;j++){
//some code
}
if(k==0){
//some code
}
}
t_end = clock();
t=t_end-t_start;
double time_taken = ((double)t)/CLOCKS_PER_SEC;
printf("outer for-loop took %f seconds to execute \n", time_taken);
}
void fun2(){
int i=0,j=0,k=0;
clock_t t2=0,t2_start=0,t2_end=0;
for(i=0;i<100000;i++){
//time the inner for loop
t2_start=clock();
for(j=0;j<1000;j++){
//some code
}
t2_end=clock();
t2+=(t2_end-t2_start);
if(k==0){
//some code
}
}
double time_taken = ((double)t2)/CLOCKS_PER_SEC;
printf("inner for-loop took %f seconds to execute \n", time_taken);
}
void fun3(){
int i=0,j=0,k=0;
clock_t t3=0,t3_start=0,t3_end=0;
for(i=0;i<100000;i++){
for(j=0;j<1000;j++){
//some code
}
//time the if check
t3_start=clock();
if(k==0){
//some code
}
t3_end=clock();
t3+=(t3_end-t3_start);
}
double time_taken = ((double)t3)/CLOCKS_PER_SEC;
printf("if-check took %f seconds to execute \n", time_taken);
}
答案 0 :(得分:0)
预期的答案是t
中的fun1
,可能比t2+t3
和fun2
中的fun3
略小代表评估外部循环本身的额外时间。
然而,度量本身所花费的时间却很少,这将是每次度量一次调用clock()
本身的时间。在测量内部循环时,由于外部循环的迭代,有效地乘以100,000。
这是一个用于测量测量本身的程序,并且对于良好的测量而言,它还测量评估空的外部循环的时间。
#include <time.h>
#include <stdio.h>
int main () {
clock_t t = 0;
clock_t t_start, t_end;
for (int i = 0; i < 100000; i++) {
t_start = clock();
t_end = clock();
t += (t_end - t_start);
}
double time_taken = ((double) t) / CLOCKS_PER_SEC;
printf ("Time imposed by measurement itself: %fsec\n", time_taken);
t_start = clock();
for (int i = 0; i < 100000; i++) {
}
t_end = clock();
t = (t_end - t_start);
time_taken = ((double) t) / CLOCKS_PER_SEC;
printf ("Time to evaluate the loop: %fsec\n", time_taken);
}
至少在我的系统上,这表明测量值可能会使结果有些偏差:
Time imposed by measurement itself: 0.056949sec
Time to evaluate the loop: 0.000200sec
要获取您的内循环“真正”花费的时间,您需要减去通过测量它所增加的时间。