2012-10-09 16 views
2

我有一段代碼,我想計算兩個排序算法合併排序和快速排序所花費的時間,以微妙或更精確的方式排序N個數字。 然後我們輸出到終端。 代碼(代碼部分):在C程序中使用特定函數計算所需時間

printf("THE LIST BEFORE SORTING IS(UNSORTED LIST):\n"); 
printlist(arr,n); 
mergesort(extarr,0,n-1); 
printf("THE LIST AFTER SORTING BY MERGE SORT IS(SORTED LIST):\n"); 
printlist(extarr,n); 
quicksort(arr,0,n-1); 
printf("THE LIST AFTER SORTING BY QUICK SORT IS(SORTED LIST):\n"); 
printlist(arr,n); 

幫助我通過提供怎麼會done.I已採取兩個變量的啓停和分別保持它們的上面和下面的函數調用但這並不試圖用clock_t完全可以幫助他們,並且始終將其差異打印爲零。 請牢記在任何類型的操作系統中運行都沒有問題,請提出一些其他方法或功能。 感謝您提前提供任何幫助。

回答

1

您可以在Linux中調用gettimeofday函數,在Windows中調用timeGetTime。在調用你的排序函數之前以及在調用你的排序函數之後調用這些函數並且改變它們。

請查看手冊頁以瞭解更多詳情。如果你仍然無法得到一些有形的數據(由於數據集較小,所花費的時間可能太少),最好嘗試一起測量'n'次迭代的時間,然後推斷單次運行的時間或者增加要排序的數據集的大小。

+0

很好的例子爲您創建,其中包括如何計算()由gettimeofday的返回的2層的timeval結構的差異。 http://www.mpp.mpg.de/~huber/util/timevaldiff.c – goji

+0

@jay我想製作一個可以在兩個操作系統中運行的程序。 不希望如果我運行此操作系統比必須這樣做,如果我運行該操作系統比必須這樣做 – Mcolorz

+0

不幸的是,使用系統調用時沒有辦法解決這個問題。 Windows不支持完整的POSIX標準,所以你將不得不求助於不同的系統調用/接口。 –

1

不確定您是否嘗試了以下方法。我知道你原來的帖子說你已經嘗試過使用CLOCKS_PER_SEC。使用CLOCKS_PER_SEC並做(stop-start)/CLOCKS_PER_SEC可以讓你得到秒。雙將提供更高的精度。

#include <time.h> 

main() 
{ 
clock_t launch = clock(); 
//do work 
clock_t done = clock(); 
double diff = (done - launch)/CLOCKS_PER_SEC; 
} 
0

如果你在Linux的2.6.26或以上則的getrusage(2)去最準確的方法:

#include <sys/time.h> 
#include <sys/resource.h> 

// since Linux 2.6.26 
// The macro is not defined in all headers, but supported if your Linux version matches 
#ifndef RUSAGE_THREAD 
#define RUSAGE_THREAD 1 
#endif 
// If you are single-threaded then RUSAGE_SELF is POSIX compliant 
// http://linux.die.net/man/2/getrusage 

struct rusage rusage_start, rusage_stop; 

getrusage(RUSAGE_THREAD, &rusage_start); 

... 

getrusage(RUSAGE_THREAD, &rusage_stop); 

// amount of microseconds spent in user space 
size_t user_time = ((rusage_stop.ru_utime.tv_sec - rusage_start.ru_stime.tv_sec) * 1000000) + rusage_stop.ru_utime.tv_usec - rusage_start.ru_stime.tv_usec; 
// amount of microseconds spent in kernel space 
size_t system_time = ((rusage_stop.ru_stime.tv_sec - rusage_start.ru_stime.tv_sec) * 1000000) + rusage_stop.ru_stime.tv_usec - rusage_start.ru_stime.tv_usec; 
1

的原因,去Zero的結果很可能是較差的分辨率您正在使用的時間源。這些時間源通常會增加10到20毫秒。這很糟糕,但這是他們工作的方式。當您的排序完成時間少於此時間增量時,結果將爲zero。您可以通過增加系統中斷頻率來將此結果增加到1 ms的狀態。有沒有標準的方法來完成這個Linux的Windows and。他們有自己的方式。 通過高頻計數器可以獲得更高的分辨率。 Windows和Linux確實提供了對這些計數器的訪問權限,但是代碼可能看起來略有不同。

如果你值得one piece of code運行在windows and linux,我建議在循環中執行時間測量。運行代碼在循環中測量數百次甚至更多次,並捕獲循環外的時間。將捕獲的時間除以循環的數目並得出結果。

當然:這僅用於評估。你不想在最終的代碼中有。 And:考慮到時間分辨率在1到20毫秒內,您應該對總體時間做出正確選擇,以獲得體面的分辨率。 (提示:調整循環計數讓它至少持續一秒左右。)

實施例:

clock_t start, end; 

printf("THE LIST BEFORE SORTING IS(UNSORTED LIST):\n"); 
printlist(arr,n); 

start = clock(); 
for(int i = 0; i < 100; i++){ 
    mergesort(extarr,0,n-1); 
} 
end = clock(); 
double diff = (end - start)/CLOCKS_PER_SEC; 

// and so on... 

printf("THE LIST AFTER SORTING BY MERGE SORT IS(SORTED LIST):\n"); 
printlist(extarr,n); 
quicksort(arr,0,n-1); 
printf("THE LIST AFTER SORTING BY QUICK SORT IS(SORTED LIST):\n"); 
printlist(arr,n); 
2

方法:1

爲了計算由程序可以使用Linux的效用的 「時間」 所採取的總時間。

Lets your program name is test.cpp. 
    $g++ -o test test.cpp 
    $time ./test 

    Output will be like : 
    real 0m11.418s 
    user 0m0.004s 
    sys 0m0.004s 

方法:2

您也可以使用Linux的分析方法 「gprof的」 找不同功能的時間。

首先你必須用「-pg」標誌來編譯程序。

$g++ -pg -o test test.cpp 
    $./test 
    $gprof test gmon.out 

PS:是gmon.out是默認的文件由gprof的