2014-01-10 63 views
1

我們正在編寫關於不同排序算法的報告。他們所有的工作,但對於打印合並中的處理時間,當我得到一個錯誤的排序時間(* time_t)沒有得到當前時間(作業)

我寫了下面的代碼

...BubbleSort(arr3,50000); 

time(&time_now); 
f = difftime(time_now,time_then); 
printf("BubbleSort - tempo: %f\n",f); 

time(&time_then); 
printf("then: %s",ctime(&time_then)); 
MergeSort(arr4,0,49999); 

time(&time_now); 
printf("now: %s",ctime(&time_now)); 
f = difftime(time_now,time_then); 

printf("MergeSort - tempo: %f\n",f); 

,但它總是說時間= 0的合併排序

enter image description here

似乎無法獲取當前時間或歸併的處理時間是非常低的(但它的工作原理) 在此先感謝

+3

你對MergeSort的實現是什麼樣的?另外,'時間'可能不會爲您提供更快的操作所需的精度。 'clock()'更常用於進行這種比較......或者來自boost的高精度定時器。 –

+1

你已經有了一個假設(「真的很低」),所以你爲什麼不測試它?排序更多的數據? – PlasmaHH

+0

'difftime()'以秒爲單位返回差值(儘管返回值是'double'...)。在'time_then'和'time_now'之間是0秒的差異,正如你在輸出中看到的那樣。所以一切正常。 – mb84

回答

7

你看零,因爲你MergeSort是如此之快,你的系統上檢測的時間間隔下完成英寸

爲您的程序提供更多的數據來排序應該有所幫助。或者,您可以更改時間測量機制以獲得更精確的內容。不過,第二種方法依賴於系統。

的執行時間MergeSort成長,如N *登錄(N),所以看到時間與的BubbleSort其隨n 可比性,你需要給它顯著更多的數據。對於50,000個項目的數組,該數學運算出大約3000個的大小。如果您通過MergeSort大約50,000 * 3,000 = 150,000,000個項目的數組,您應該看到打印的非零數字。

注意:不要嘗試將那麼多的數據傳遞給BubbleSort--要花費時間才能完成,除非數據已經非常接近排序了。

+0

@maxpesa:通過使用特定於平臺的定時函數,例如Windows下的QueryPerformanceCounter,可以獲得更高的精度。或者你可以使用Boost,它可以做到這一點,但是將其全部包裝在平臺不可知的方式中。 –

6

請勿使用time來計算程序/算法的運行時間。這是全球系統時間,包括搶佔時間和運行後臺的其他程序。

使用getrusage可以獲取代碼的資源(CPU時間)使用情況。

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



struct rusage start, end; 
getrusage(RUSAGE_SELF, &start); 

// run your code 

getrusage(RUSAGE_SELF, &end); 

struct timeval used_utime, used_stime; 
timersub(&end.ru_utime, &start.ru_utime, &used_utime); 
timersub(&end.ru_stime, &start.ru_stime, &used_stime); 
printf("function ran for %d usec in user mode and %d usec in system mode \n" 
    , used_utime.tv_sec * 1000 * 1000 + used_utime.tv_usec 
    , used_stime.tv_sec * 1000 * 1000 + used_stime.tv_usec); 
+0

你可以請張貼一些代碼嗎? – maxpesa

+0

@maxpesa更新示例代碼。 –

+1

@maxpesa第一次檢查這是否適合您的環境! [的getrusage](HTTP://linux.die。net/man/2/getrusage) –

0

time函數和time_t類型的粒度通常是秒,所以如果你的函數返回的時間少於1秒,則diff將爲零。 對於快速和骯髒的基準測試,您可以使用clock()

2

取決於您是否需要經過或CPU時間。以下是兩者。

// On Raspberry Pi gcc timing.c -lrt -O3 -o timer 

    #include <time.h> 
    #include <stdio.h> 

    double theseSecs = 0.0; 
    double startSecs = 0.0; 
    double secs; 
    double CPUsecs = 0.0; 
    double CPUutilisation = 0.0; 
    double answer = 0; 
    clock_t starts; 

    void start_CPU_time() 
    {  
     starts = clock();; 
     return; 
    } 

    void end_CPU_time() 
    { 
     CPUsecs = (double)(clock() - starts)/(double)CLOCKS_PER_SEC; 
     return; 
    }  

    struct timespec tp1; 
    void getSecs() 
    { 
    clock_gettime(CLOCK_REALTIME, &tp1); 
    theseSecs = tp1.tv_sec + tp1.tv_nsec/1e9;   
    return; 
    } 

    void start_time() 
    { 
     getSecs(); 
     startSecs = theseSecs; 
     return; 
    } 

    void end_time() 
    { 
     getSecs(); 
     secs = theseSecs - startSecs; 
     return; 
    }  

    void calculate() 
    { 
     int i, j; 
     for (i=1; i<100001; i++) 
     { 
      for (j=1; j<10001; j++) 
      { 
       answer = answer + (float)i/100000000.0; 
      } 
     } 
    } 

void main() 
{ 
    start_time(); 
    start_CPU_time(); 
    calculate(); 
    end_time(); 
    end_CPU_time(); 
    CPUutilisation = CPUsecs/secs * 100.0; 
    printf("\n Answer %10.1f, Elapsed Time %7.4f, CPU Time %7.4f, CPU Ut %3.0f%\n", 
       answer, secs, CPUsecs, CPUutilisation); 
} 
+0

它看起來很乾淨整潔。 +1 –