2013-09-16 34 views
6

今天我做了一個簡單的測試來比較java和c之間的速度 - 一個簡單的循環使得整數「i」從0增加到20億。Java比C更快

我真的希望c語言比java更快。我對結果感到驚訝:

java所需時間:約1.8

c:約需要幾秒鐘的時間。 3.6秒。

我不認爲java是一種更快的語言,但我不明白爲什麼在我的簡單程序中循環速度是c的兩倍?

我在程序中做了一個關鍵的錯誤?還是MinGW編譯器配置不好或者什麼的?

public class Jrand { 

public static void main (String[] args) { 

    long startTime = System.currentTimeMillis(); 
    int i; 
    for (i = 0; i < 2000000000; i++) { 
     // Do nothing! 
    } 
    long endTime = System.currentTimeMillis(); 
    float totalTime = (endTime - startTime); 

    System.out.println("time: " + totalTime/1000); 
} 

} 

的C程序

#include<stdio.h> 
#include<stdlib.h> 
#include <time.h> 
int main() { 

    clock_t startTime; 
    startTime = clock(); 

    int i; 
    for (i = 0; i <= 2000000000; i++) { 
     // Do nothing 
    } 
    clock_t endTime; 
    endTime = clock(); 

    float totalTime = endTime - startTime; 
    printf("%f", totalTime/1000); 

    return 0; 
} 
+3

的循環在Java中很可能被忽略。嘗試在循環中做一些有意義的事情,比如更新總和並在循環之後打印它。另請參閱[本主題](http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java) –

+4

優化程序。正如桑傑說的。 – Devolus

+11

你打開了C構建的優化嗎?我猜你可能沒有,否則,你的C代碼應該返回0秒。 – Mysticial

回答

21

使用除-O0以外的任何優化級別(例如-O2)重建您的C版本,您會發現它在0秒內運行。所以Java版本需要1.6秒才能做任何事情,而C版本則需要0.0秒(實際上約爲0.00005秒)才能不做任何事情。

+7

也許在他的系統上。在我的舊筆記本電腦(Core 2 Duo)的第一次運行* Java版本需要0.059秒......這只是JVM的啓動時間,可能是磁盤IO。以防萬一有Java解析器在這裏。 –

+0

謝謝!我使用了-O2並添加了一個簡單的計算器。在循環內。 c語言:0.0000 ...秒。 Java:6.7秒。後者是否也可以優化? –

+0

@owlstead:啓動開銷爲0.059秒是很多理由對Java進行打擊。它比典型幀率/刷新率的幀時間更長。 –

10

Java是消除代碼沒有做任何事情更積極。開發人員不太可能知道他們在做什麼。你沒有計算循環,但需要多長時間才能檢測並消除循環。

簡而言之,Java無所事事通常會更快。

此外,您可能會發現,如果優化C代碼並刪除調試信息,它將執行相同的操作,最可能更短。

+6

除非您故意編譯禁用優化,這是一種單步執行程序並能夠理解抽象機的流程的工具,任何體面的C編譯器肯定不會產生無用循環的代碼。 –

1

如果你想以此爲基準,而不是無所作爲,可以嘗試一些有用的東西,比如每次迭代計算一些東西。對於例如對其他變量中的循環進行計數,並確保在最後使用它(例如通過打印它),以便它不會被優化。

交替簡單測試可以線性訪問數組(只讀),將元素從一個數組複製到另一個數組(讀取+寫入)或對數據執行一些操作。其中一些情況可能很有趣,因爲它們會打開幾個非常簡單的編譯器優化,您可以稍後在結果二進制/字節碼中看到這些優化,例如循環展開,寄存器分配以及更復雜的向量化或代碼運動等。在其他Java可以使用一些技巧厲害如jitting(動態重新編譯上飛)

編譯器優化的範圍是巨大的,你剛剛遇到的最基本的一個 - 消除無用的代碼:)