不經意翻看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,如需轉載請自行聯系原作者