天天看点

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,如需转载请自行联系原作者