我如何計算在下面的代碼執行時間:如何計算C中的執行時間?
#include <stdio.h> /* Core input/output operations */
#include <stdlib.h> /* Conversions, random numbers, memory allocation, etc. */
#include <math.h> /* Common mathematical functions */
#include <time.h> /* Converting between various date/time formats */
#include <sys/time.h>
#define PI 3.1415926535 /* Known vaue of PI */
#define NDARTS 128 /* Number of darts thrown */
double pseudo_random(double a, double b) {
double r; /* Random number */
r = ((b - a) * ((double) rand()/(double) RAND_MAX)) + a;
return r;
}
int main (int argc, char *argv[]) {
int n_procs, /* Number of processors */
llimit, /* Lower limit for random numbers */
ulimit, /* Upper limit for random numbers */
n_circle, /* Number of darts that hit the circle */
i; /* Dummy/Running index */
double pi_sum, /* Sum of PI values from each WORKER */
x, /* x coordinate, betwen -1 & +1 */
y, /* y coordinate, betwen -1 & +1 */
z, /* Sum of x^2 and y^2 */
error; /* Error in calculation of PI */
clock_t start_time, /* Wall clock - start time */
end_time; /* Wall clock - end time */
struct timeval stime, starttime1, endtime1;
struct timeval tv1, tv2, diff;
llimit = -1;
ulimit = 1;
n_circle = 0;
printf("\n Monte Carlo method of finding PI\n\n");
printf(" Number of processors : %d\n", n_procs);
printf(" Number of darts : %d\n\n", NDARTS);
gettimeofday(&tv1, NULL);
gettimeofday(&stime, NULL);
srand(stime.tv_usec * stime.tv_usec * stime.tv_usec * stime.tv_usec);
for (i = 1; i <= NDARTS; i++) {
x = pseudo_random(llimit, ulimit);
y = pseudo_random(llimit, ulimit);
z = pow(x, 2) + pow(y, 2);
if (z <= 1.0) {
n_circle++;
}
}
pi_sum = 4.0 * (double)n_circle/(double)NDARTS;
pi_sum = pi_sum/n_procs;
error = fabs((pi_sum - PI)/PI) * 100;
gettimeofday(&tv2, NULL);
double timeval_subtract (result, x, y)
{
result = ((double) x - (double) y)/(double)CLOCKS_PER_SEC;
}
double result1 = timeval_subtract(&diff, &tv1, &tv2);
printf(" Known value of PI : %11.10f\n", PI);
printf(" Average value of PI : %11.10f\n", pi_sum);
printf(" Percentage Error : %10.8f\n", error);
printf(" Time : \n", clock());
printf(" Start Time : \n",&tv1);
printf(" End Time :\n", &tv2);
printf(" Time elapsed (sec) : \n", result1);
return 0;
}
我用timeval_subtract功能,當我執行的代碼,我得到:
Monte Carlo method of finding PI
Number of processors : 16372
Number of darts : 128
Known value of PI : 3.1415926535
Average value of PI : 0.0002004184
Percentage Error : 99.99362048
Time :
Start Time :
End Time :
Time elapsed (sec) :
首先,我找不到找到處理器數量的錯誤(我必須得到1個處理器)。
第二個「哪個是最重要的一點」,爲什麼我的時間,開始時間,結束時間和時間都是空的?
我想你可能要考慮使用一個分析器。 – stdcall
請打開你的編譯器的警告。它會告訴你打印輸出和'n_procs'有什麼問題。 – Mat
clock()不會測量程序執行的時間,但會嘗試返回CPU使用的時鐘週期(通常在tics或jiffies中測量)。但即使您將此值轉換爲秒(通過將其除以CLOCKS_PER_SEC,結果可能會與程序實際完成時間有很大的不同,它的差異程度取決於程序的功能。 – alk