2011-10-13 31 views
2

我在做一個涉及比較編程語言的項目。我正在計算阿克曼功能。我測試了Java,Python和Ruby,並在10到30毫秒之間得到響應。但是C++似乎需要125毫秒。這是正常的,還是與gettimeofday()有關? Gettimeofday()在time.h中。gettimeofday()C++不一致

我在(虛擬)Ubuntu Natty Narwhal 32位測試。我不是短處理能力(四核2.13 GHz Intel Xeon)。

我的代碼是在這裏:

#include <iostream> 
#include <sys/time.h> 
using namespace std; 
int a(int m,int n) { 
    if (m == 0) { 
    return n + 1; 
    } else if (m > 0 and n == 0) { 
    return a(m-1,1); 
    } else if (m > 0 and n > 0) { 
    return a(m-1,a(m,n-1)); 
    } 
} 

int main() { 
    timeval tim; 
    gettimeofday(&tim,NULL); 
    double t1 = tim.tv_usec; 
    int v = a(3,4);   
    gettimeofday(&tim,NULL); 
    double t2 = tim.tv_usec; 
    cout << v << endl << t2-t1; 
    return 0; 
}  
+1

你在哪個平臺上運行?你用什麼實際的代碼來進行測量? –

+0

你是怎麼測試這個的? –

+0

你能否至少向我們展示你的代碼,看看你是如何做到的? –

回答

5

假設你正在談論分辨率數據的返回(一)the POSIX specificationgettimeofday狀態:

的分辨率系統時鐘未指定。

這是由於這樣的事實,即系統可能具有變化很大的跟蹤小時間段的能力。即使ISO標準clock()功能包括這樣的警告。

如果你在談論需要多長時間稱之爲(一),該標準使有關沿着這些線路的性能沒有保證。實現是完全自由地等待125分鐘給你的時間之前,但我懷疑這樣的實施將有很大的市場成功:-)

由於有限的分辨率的例子,我在下面的代碼類型檢查它:

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

#define NUMBER 30 

int main (void) { 
    struct timeval tv[NUMBER]; 
    int count[NUMBER], i, diff; 

    gettimeofday (&tv[0], NULL); 

    for (i = 1; i < NUMBER; i++) { 
     gettimeofday (&tv[i], NULL); 
     count[i] = 1; 
     while ((tv[i].tv_sec == tv[i-1].tv_sec) && 
      (tv[i].tv_usec == tv[i-1].tv_usec)) 
     { 
      gettimeofday (&tv[i], NULL); 
      count[i]++; 
     } 
    } 

    printf ("%2d: secs = %d, usecs = %6d\n", 0, tv[0].tv_sec, tv[0].tv_usec); 
    for (i = 1; i < NUMBER; i++) { 
     diff = (tv[i].tv_sec - tv[i-1].tv_sec) * 1000000; 
     diff += tv[i].tv_usec - tv[i-1].tv_usec; 

     printf ("%2d: secs = %d, usecs = %6d, count = %5d, diff = %d\n", 
      i, tv[i].tv_sec, tv[i].tv_usec, count[i], diff); 
    } 

    return 0; 
} 

的代碼基本上記錄在底層時間的變化,保持它的多少來電走上gettimeofday()爲真正改變的時間計數。這是在我的新i7 grunter筆記本電腦上,因此它的處理能力並不短(計數表明多久它可以撥打gettimeofday()每個時間段,5000個標記)。

產量爲:

0: secs = 1318554836, usecs = 990820 
1: secs = 1318554836, usecs = 991820, count = 5129, diff = 1000 
2: secs = 1318554836, usecs = 992820, count = 5807, diff = 1000 
3: secs = 1318554836, usecs = 993820, count = 5901, diff = 1000 
4: secs = 1318554836, usecs = 994820, count = 5916, diff = 1000 
5: secs = 1318554836, usecs = 995820, count = 5925, diff = 1000 
6: secs = 1318554836, usecs = 996820, count = 5814, diff = 1000 
7: secs = 1318554836, usecs = 997820, count = 5814, diff = 1000 
8: secs = 1318554836, usecs = 998820, count = 5819, diff = 1000 
9: secs = 1318554836, usecs = 999820, count = 5901, diff = 1000 
10: secs = 1318554837, usecs = 820, count = 5815, diff = 1000 
11: secs = 1318554837, usecs = 1820, count = 5866, diff = 1000 
12: secs = 1318554837, usecs = 2820, count = 5849, diff = 1000 
13: secs = 1318554837, usecs = 3820, count = 5857, diff = 1000 
14: secs = 1318554837, usecs = 4820, count = 5867, diff = 1000 
15: secs = 1318554837, usecs = 5820, count = 5852, diff = 1000 
16: secs = 1318554837, usecs = 6820, count = 5865, diff = 1000 
17: secs = 1318554837, usecs = 7820, count = 5867, diff = 1000 
18: secs = 1318554837, usecs = 8820, count = 5885, diff = 1000 
19: secs = 1318554837, usecs = 9820, count = 5864, diff = 1000 
20: secs = 1318554837, usecs = 10820, count = 5918, diff = 1000 
21: secs = 1318554837, usecs = 11820, count = 5869, diff = 1000 
22: secs = 1318554837, usecs = 12820, count = 5866, diff = 1000 
23: secs = 1318554837, usecs = 13820, count = 5875, diff = 1000 
24: secs = 1318554837, usecs = 14820, count = 5925, diff = 1000 
25: secs = 1318554837, usecs = 15820, count = 5870, diff = 1000 
26: secs = 1318554837, usecs = 16820, count = 5877, diff = 1000 
27: secs = 1318554837, usecs = 17820, count = 5868, diff = 1000 
28: secs = 1318554837, usecs = 18820, count = 5874, diff = 1000 
29: secs = 1318554837, usecs = 19820, count = 5862, diff = 1000 

顯示,該決議似乎被限制在沒有更好的千餘家微秒。當然,你的系統可能與此不同,最重要的是它取決於你的實現和/或環境。


(一)如果你談論的是我沒有想到的,你應該充實你的問題有更詳細一點東西別的。我們在這裏非常好,但我們不是無所不知的。