我的程序将在时间和空间上相互竞争不同的排序算法.我有空间,但测量时间给我带来了一些麻烦.以下是运行排序的代码:
void test(short* n, short len) {
short i, j, a[1024];
for(i=0; i<2; i++) { // Loop over each sort algo
memused = 0; // Initialize memory marker
for(j=0; j<len; j++) // Copy scrambled list into fresh array
a[j] = n[j]; // (Sorting algos are in-place)
// ***Point A***
switch(i) { // Pick sorting algo
case 0:
selectionSort(a, len);
case 1:
quicksort(a, len);
}
// ***Point B***
spc[i][len] = memused; // Record how much mem was used
}
}
Run Code Online (Sandbox Code Playgroud)
(为简单起见,我删除了一些排序算法)
现在,我需要测量排序算法需要多长时间.最明显的方法是在点(a)记录时间,然后从点(b)的时间减去该时间.但是没有一个C时间函数足够好:
time()给了我几秒钟的时间,但是algos比那更快,所以我需要更准确的东西.
clock()给了我自程序启动以来的CPU滴答,但似乎舍入到最接近的10,000; 还不够小
该时间 shell命令的作品不够好,但我需要运行每个算法超过1000测试,我需要为每一个单独的时间.
我不知道getrusage()返回什么,但它也太长了.
我需要的是时间单位(显着,如果可能)小于排序功能的运行时间:大约2ms.所以我的问题是:我在哪里可以得到它?
小智 13
gettimeofday() 具有微秒分辨率且易于使用.
一对有用的计时器功能是:
static struct timeval tm1;
static inline void start()
{
gettimeofday(&tm1, NULL);
}
static inline void stop()
{
struct timeval tm2;
gettimeofday(&tm2, NULL);
unsigned long long t = 1000 * (tm2.tv_sec - tm1.tv_sec) + (tm2.tv_usec - tm1.tv_usec) / 1000;
printf("%llu ms\n", t);
}
Run Code Online (Sandbox Code Playgroud)
The*_*Saw 10
用于测量时间,使用clock_gettime与CLOCK_MONOTONIC(或CLOCK_MONOTONIC_RAW如果它是可用的).尽可能避免使用gettimeofday.它特别弃用clock_gettime,并且从它返回的时间可能会受到时间服务器的调整,这可能会导致您的测量结果失效.