老問題新測試:java和C單機效能比較

banq發表於2009-09-08
Java和C最大的不同是在於Java的可伸縮性Scalable,能夠平滑發展到分散式雲端計算平臺,透過雲端計算能夠處理不斷增長的業務訪問量,這個代價過程是非常小容易的。

那麼在單機環境下,Java過去一直被認為低於C程式,最近老外做了一個實驗,進行了比較:

String Hash案例
Complete C++ code: http://pastebin.com/d280c1cd4
Complete Java code: http://pastebin.com/m541c4655
主要核心程式如下,是一個迴圈:

int h=0;
  for( int i=0; i<len; i++ )
    h = 31*h+str[i];
  return h;
<p class="indent">

在新的x86上執行100 million 迴圈,結果如下:
> a.out 100000000
100000000 hashes in 5.636362 secs
> java str_hash 100000000
100000000 hashes in 5.745 secs

兩者相差無多,據作者介紹,如果在老版本的gcc & Java比較,Java會比C快15%,但這次是C++ 要快2%。


篩選案例
Complete C++ code: http://pastebin.com/m3784c090
Complete Java code: http://pastebin.com/m4b414295
核心程式碼如下:

bool *sieve = new bool[max];
  for (int i=0; i<max; i++) sieve[i] = true;
  sieve[0] = false;
  sieve[1] = false;
  int lim = (int)sqrt(max);
  for (int n=2; n<lim; n++) {
    if (sieve[n]) {
      for (int j=2*n; j<max; j+=n)
        sieve[j] = false;
    }
  }
<p class="indent">

測試結果:
> a.out 100000000
100000000 primes in 1.568016 secs
> java sieve 100000000
100000000 primes in 1.548 secs
Java要快些。

Profiling Enables Big Gains案例
Complete C code:
vcall.cpp http://pastebin.com/m70dbe7d6
vcall.hpp http://pastebin.com/m13055a8c
A.cpp http://pastebin.com/m5aa1b232
B.cpp http://pastebin.com/m2e46ec23

Complete Java code:
vcall.java http://pastebin.com/m149bbdf0
A.java http://pastebin.com/m2e33d6df
B.java http://pastebin.com/m2b1d75bb

核心程式碼是:

int sum=0;
    for (int i = 0; i < max; i++) 
      sum += val();  // virtual call
    return sum;
<p class="indent">

在同樣x86上測試結果:
> a.out 1000000000 0
1000000000 adds in 2.657645 secs
> java vcall 1000000000 0
1000000000 adds in 0.0 secs

Java幾乎是無限地快,至少可以說明Java不比C慢,甚至在某些情況下快於C,那種認為java比C慢的觀點應該扔到垃圾堆裡去了。

原文:

Java vs C performance... again...



[該貼被banq於2009-09-08 11:21修改過]

相關文章