我正在使用 gettimeofday 函数测量经过的时间,并且我会比较不同代码中测量的时间,以便确定哪个代码更快。我知道每次运行的测量时间通常是不同的。我读到差异甚至可能达到 30%。嗯...我注意到在我的例子中差异也可以达到 1000%。那么,我怎样才能充分估计代码所花费的时间呢?我可以多次运行相同的代码并调节测量的时间,单个测量的平均值应该更精确。但我注意到重复次数应该非常大,以便即使在测量不同时间的平均时间时也不会获得非常不同的值。我想知道我是否必须测试一次运行需要很多秒的代码。 那么,如何足够精确地确定哪个代码比另一个代码更快呢? 下面我发布了一个示例,其中我正在测量内部 for 循环所花费的时间。为了使平均时间不被广泛传播,我必须使用 M=100000。有什么建议(不太难实施)来使测量的时间更精确、重复次数更少?
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <assert.h>
#include <sys/time.h>
double *Vec(int n)
{
double *p = (double*)malloc(n * sizeof(double));
assert(p != NULL);
return p;
}
int main()
{
int N = 10000;
int M = 100000;
double* v = Vec(N);
double* t = Vec(M);
struct timeval begin, end;
srand(time(0));
for (int j=0; j<M; j++)
{
gettimeofday(&begin, 0);
for (int i=0; i<N; i++)
{
v[i] = rand() % 100;
//v[i] = rand()*100/(RAND_MAX +1.0);
}
gettimeofday(&end, 0);
long seconds = end.tv_sec - begin.tv_sec;
long microseconds = end.tv_usec - begin.tv_usec;
t[j] = seconds + microseconds*1e-6;
}
double tmean = 0;
for (int j=0; j<M; j++)
{
tmean += t[j]/M;
}
printf("Mean time: %.6f ms.\n", tmean*1000);
free(v);
free(t);
return 0;
}
在 Windows 上,您可以使用以下几种方法: \
示例:
#include <windows.h>
#include <stdio.h>
void functionToMeasure()
{
Sleep(2);
}
int main()
{
LARGE_INTEGER frequency, start, end;
double elapsedTime;
// Get the frequency of the high-resolution performance counter
QueryPerformanceFrequency(&frequency);
// Get the start time
QueryPerformanceCounter(&start);
functionToMeasure();
QueryPerformanceCounter(&end);
// Calculate elapsed time in milliseconds
elapsedTime = (double)(end.QuadPart - start.QuadPart) * 1000.0 / frequency.QuadPart;
printf("Execution time: %.3f ms\n", elapsedTime);
return 0;
}
DWORD64 start, end;
start = GetTickCount64();
functionToMeasure();
end = GetTickCount64();
clock_t start, end;
double elapsedTime;
start = clock();
functionToMeasure();
end = clock();
elapsedTime = ((double)(end - start) / CLOCKS_PER_SEC) * 1000.0;
printf("Execution time: %.3f ms\n", elapsedTime);