【发布时间】:2013-05-26 22:27:56
【问题描述】:
我的程序将在时间和空间上相互竞争不同的排序算法。我已经占满了空间,但是测量时间给我带来了一些麻烦。这是运行排序的代码:
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
}
}
(为简单起见,我删除了一些排序算法)
现在,我需要测量排序算法需要多少时间。最明显的方法是记录 (a) 点的时间,然后从 (b) 点的时间中减去该时间。但是没有一个 C 时间函数足够好:
time() 给了我以秒为单位的时间,但算法比这更快,所以我需要更准确的东西。
clock() 给了我自程序启动以来的 CPU 滴答声,但似乎四舍五入到最接近的 10,000;还是不够小
time shell 命令运行良好,但我需要为每个算法运行超过 1,000 次测试,而且我需要为每个算法设置单独的时间。
我不知道 getrusage() 返回什么,但它也太长了。
我需要的是比排序函数的运行时间更小的单位时间(如果可能的话,显着地):大约 2 毫秒。所以我的问题是:我在哪里可以得到它?
【问题讨论】:
-
哪个平台?提及
getrusage()建议使用POSIX 系统,在这种情况下gettimeofday()或clock_gettime()是合适的(分别为微秒和纳秒分辨率,不一定具有规定的精度)。 -
man 2 clock_gettime,或者,如果你可以使用 C 2011,int timespec_get(struct timespec *ts, int base); -
平台:AMD Athlon 64(运行 Debian Linux)