在 Windows 操作系统上用 C 语言测量时间

问题描述 投票:0回答:1

我正在使用 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;
}
c time gettimeofday
1个回答
0
投票

在 Windows 上,您可以使用以下几种方法: \

  1. 使用 QueryPerformanceCounter(高分辨率计时器)(亚微秒分辨率)。

示例:

#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;
}
  1. GetTickCount64(毫秒分辨率)
   DWORD64 start, end;
    start = GetTickCount64();
    functionToMeasure();
    end = GetTickCount64();
  1. 功能(1--15ms分辨率)
    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);
© www.soinside.com 2019 - 2024. All rights reserved.