2014-09-02 45 views
-5

我剛剛寫了一個程序,找到所有素數與上限。Java vs C(運行時間)編輯:添加代碼

算法:Eratosthenes篩。

在C和Java中都寫了它。上限是666014.

出於某種原因,C給出的結果在超過2.5秒,而Java做它在像半秒鐘。

詳細說明:

  • 在C中的陣列是char類型的

  • Java中的陣列是布爾類型的

ÇIDE:碼塊

Java IDE:IntellijIdea社區版

的C代碼:

#include <stdio.h> 

int main() { 

    int n = 666013; 
    int i; 
    int k; 

    char a[n]; 

    for (i = 2; i <= n; i++) 
     a[i] = 0; 

    for (i = 2; i <= n; i++) 
     if (a[i] == 0) 
     { 
      printf("%d\n", i); 
      for (k = i + i; k <= n; k += i) 
       a[k] = 1; 
     } 

    return 0; 

} 

Java代碼:

package primes; 

public class Prime { 

    public static void main(String[] args) { 
     long starttime = System.nanoTime(); 
     final int MAXN = 666013; 
     boolean a[] = new boolean[MAXN]; 

     for (int i = 2; i < a.length; i++) 
      a[i] = true; 

     for (int i = 2; i < a.length; i++) 
      if (a[i]) 
      { 
       System.out.println(i); 
       System.out.printf(""); 
       for (int j = i + i; j < a.length; j += i) { 
        a[j] = false; 
       } 
      } 

     System.out.println(System.nanoTime() - starttime); 

    } 
} 

最後編輯:使用System.nanoTime() 爪哇給出0.35秒

的C算法不能被任何更快。 Java在這裏更快的原因是什麼?

+0

您有問題嗎? – 2014-09-02 18:28:12

+0

問題是? :D – 2014-09-02 18:28:21

+0

如果你打算做交叉測試,那麼使用相同的數據類型會更聰明 – Juxhin 2014-09-02 18:29:39

回答

1

我敢打賭,即使您在問題標題中列出了編譯時間,您實際上仍在詢問運行時間。如果你正在嘗試編譯時間,它真的是蘋果,特別是如果你在IDE中做而不是使用命令行的話。

如果您將Java應用程序與C++應用程序進行比較,則需要考慮很多事項。

  • 你應該使用相同的數據類型。
  • 你必須確保你的Java代碼不會觸發額外的拳擊。
  • 您應該閱讀兩種語言並找出如何使用最準確的低級系統計時器。例如,System.currentTimeMillis()在Java中不太準確。
  • 您應該確保您的時間在投入到輸出之前進行測量,以便在測試中不會測量兩種語言的輸出差異。
  • 您是否在兩種語言中運行相同的體系結構? (32或64位)。

坦率地說,你的評價是非常依賴的代碼。沒有顯示代碼,人們無法幫助你。即使是最簡單的代碼,也可以做很多事情來影響計時。

+0

只是爲了說明,System.currentTimeMillis()比nanoTime更準確() – 2014-09-02 18:38:15

+0

爲什麼出於好奇?我以爲我記得Joshua Bloch的有效Java說currentTimeMillis()是不準確的,但我沒有工作的書在一分鐘內檢查。我大概記得文字錯誤。 – 2014-09-02 18:55:18

+0

此鏈接可能是有用的:http://stackoverflow.com/questions/351565/system-currenttimemillis-vs-system-nanotime – 2014-09-02 18:58:41