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))
    count++;
   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;
  int count = 0;
  int i;
  for(i=2; i<=n; i++)
   b.set(i);
  i = 2;
  while(i*i<=n){
   if(b.test(i)){
    count++;
    int k=2*i;
    while(k<=n){
     b.reset(k);
     k+=i;
    }
   }
   i++;
  }
  while(i<=n){
   if(b.test(i))
    count++;
   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,如需转载请自行联系原作者
目录
相关文章
|
23天前
|
移动开发 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【4月更文挑战第3天】在移动开发领域,性能优化一直是开发者关注的焦点。随着Kotlin的兴起,其在Android开发中的地位逐渐上升,但关于其与Java在性能方面的对比,尚无明确共识。本文通过深入分析并结合实际测试数据,探讨了Kotlin与Java在Android平台上的性能表现,揭示了在不同场景下两者的差异及其对应用性能的潜在影响,为开发者在选择编程语言时提供参考依据。
|
30天前
|
存储 缓存 算法
【C/C++ 性能优化】提高C++程序的缓存命中率以优化性能
【C/C++ 性能优化】提高C++程序的缓存命中率以优化性能
114 0
|
1月前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【2月更文挑战第30天】 随着Kotlin成为开发Android应用的首选语言,开发者社区对于其性能表现持续关注。本文通过深入分析与基准测试,探讨Kotlin与Java在Android平台上的性能差异,揭示两种语言在编译效率、运行时性能和内存消耗方面的具体表现,并提供优化建议。我们的目标是为Android开发者提供科学依据,帮助他们在项目实践中做出明智的编程语言选择。
|
15天前
|
算法 Java C语言
C++和Java中的随机函数你玩明白了吗?内附LeetCode470.rand7()爆改rand10()巨详细题解,带你打败LeetCode%99选手
C++和Java中的随机函数你玩明白了吗?内附LeetCode470.rand7()爆改rand10()巨详细题解,带你打败LeetCode%99选手
|
30天前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
在开发高性能的Android应用时,选择合适的编程语言至关重要。近年来,Kotlin因其简洁性和功能性受到开发者的青睐,但其性能是否与传统的Java相比有所不足?本文通过对比分析Kotlin与Java在Android平台上的运行效率,揭示二者在编译速度、运行时性能及资源消耗方面的具体差异,并探讨在实际项目中如何做出最佳选择。
18 4
|
10天前
|
SQL 缓存 Java
Java数据库连接池:优化数据库访问性能
【4月更文挑战第16天】本文探讨了Java数据库连接池的重要性和优势,它能减少延迟、提高效率并增强系统的可伸缩性和稳定性。通过选择如Apache DBCP、C3P0或HikariCP等连接池技术,并进行正确配置和集成,开发者可以优化数据库访问性能。此外,批处理、缓存、索引优化和SQL调整也是提升性能的有效手段。掌握数据库连接池的使用是优化Java企业级应用的关键。
|
14天前
|
存储 Java 测试技术
Java 21革命性升级:探索分代ZGC的性能奇迹
Java 21革命性升级:探索分代ZGC的性能奇迹
14 0
|
26天前
|
缓存 算法 Java
Java内存管理:优化性能和避免内存泄漏的关键技巧
综上所述,通过合适的数据结构选择、资源释放、对象复用、引用管理等技巧,可以优化Java程序的性能并避免内存泄漏问题。
27 5
|
1月前
|
算法 IDE Java
【软件设计师备考 专题 】面向对象程序设计语言:C++、Java、Visual Basic和Visual C++
【软件设计师备考 专题 】面向对象程序设计语言:C++、Java、Visual Basic和Visual C++
41 0
|
1月前
|
Java API 开发工具
【软件设计师备考 专题 】C、C++、Java、Visual Basic、Visual C++等语言的基础知识和应用(三)
【软件设计师备考 专题 】C、C++、Java、Visual Basic、Visual C++等语言的基础知识和应用
30 0