天天看點

java性能超過C++?

不經意翻看java2核心技術卷II,在講集合那一部分有那麼一段,用了一個計算2000000以内的素數的例子,說前三個java版本java的速度不如C++,後三個版本java的速度輕松超過C++,我有些吃驚。書上也說了,公平地說,是C++的bitset庫寫得不好,用自己重寫的bitset庫,還是C++的速度快。在這個java5.0版本中,書上說的是java用105毫秒而C++的用了300多毫秒。書上接着說,“現在已經不可能了,最近的實驗表明,即使用自己寫的bitset庫,C++也要用140毫秒”。對照程式一個是用java寫的,一個是用C++寫的,格式可以說是一樣的,都用的bitset來編寫。

java程式:

import java.util.BitSet;

public class TestBitSet {

public static void main(String[] args) {

  int n=2000000;

  long start = System.currentTimeMillis();

  BitSet b = new BitSet(n+1);

  int count = 0;

  int i;

  for(i=2; i<=n; i++)

   b.set(i);

  i = 2;

  while(i*i<=n){

   if(b.get(i)){

    count++;

    int k=2*i;

    while(k<=n){

     b.clear(k);

     k+=i;

    }

   }

   i++;

  }

  while(i<=n){

   if(b.get(i))

  long end = System.currentTimeMillis();

  System.out.println(count + " primes");

  System.out.println((end-start)+" milliseconds");

}

C++程式:

#include <bitset>

#include <iostream>

#include <ctime>

using namespace std;

int main() {

  const size_t n=2000000;

  long start = clock();

  bitset<n+1> b;

   if(b.test(i)){

     b.reset(k);

   if(b.test(i))

  long end = clock();

  cout << count << " primes" << endl;

  cout << (end-start)*1000/CLOCKS_PER_SEC << " milliseconds" << endl;

程式是經過我的手敲出來的,可能在不影響性能的地方(比如類名、變量名)稍有不同,其它是原樣的。

我在我的計算機(CPU1.5G,記憶體2G)上運作了一下,确實如此,java程式用了250毫秒,而對照的C++程式用了493毫秒。雖然跟書上說的有些出入,但是确實是java程式超過了C++。看來C++中的bitset模闆确實寫得不行。于是,我自己寫了一個簡單的bitset模闆:

template <int n>

class bitset{

    typedef unsigned int size_t;

    static const size_t length=n;

    static const size_t bits = 32;

    static const size_t less = 31;

    static const size_t mask = 0x80000000;

    static const size_t full = 0xffffffff;

    static const size_t shifts = 5;

    int data[(n+less)>>shifts];

public:

    void set(size_t i){

        data[(i)>>shifts] |= mask>>(i&less);

    void reset(size_t i){

        data[(i)>>shifts] &= full-(mask>>(i&less));

    bool test(size_t i){

        return data[(i)>>shifts] & (mask>>(i&less));

};

實作原理就不在這裡多說了,用這個模闆後,C++程式的成績立即變成了125毫秒,也就是說,比java的快得多,java的在我這台計算機上的運作時間是250毫秒。我的計算機上用的是java6.0版本,雖然高版本性能應該更高,但我還是擔心受版本影響,是以到unix伺服器上java5.0環境中又對照了很多次,C++程式的成績穩定在640毫秒,而java程式的成績多則1593毫秒,少則720毫秒。

    我總是認為,java執行性能超過C++在理論上是不大可能的,java跟C++相比的優勢也不在性能。雖然java可以而且也應該不斷提高性能,但是不必以超越C++的性能為目标或者樂趣。

本文轉自 wws5201985 51CTO部落格,原文連結:http://blog.51cto.com/wws5201985/814854,如需轉載請自行聯系原作者