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,如需转载请自行联系原作者
目录
相关文章
|
2月前
|
缓存 算法 Java
Java 实现的局域网管控软件的性能调优
局域网管控软件在企业网络管理中至关重要,但随着网络规模扩大和功能需求增加,其性能可能受影响。文章分析了数据处理效率低下、网络通信延迟和资源占用过高等性能瓶颈,并提出了使用缓存、优化算法、NIO库及合理管理线程池等调优措施,最终通过性能测试验证了优化效果,显著提升了软件性能。
43 1
|
1月前
|
XML Java 数据库连接
性能提升秘籍:如何高效使用Java连接池管理数据库连接
在Java应用中,数据库连接管理至关重要。随着访问量增加,频繁创建和关闭连接会影响性能。为此,Java连接池技术应运而生,如HikariCP。本文通过代码示例介绍如何引入HikariCP依赖、配置连接池参数及使用连接池高效管理数据库连接,提升系统性能。
66 5
|
24天前
|
Java Android开发 C++
Java和C++
Java和C++
36 15
|
1月前
|
Java 数据库连接 数据库
优化之路:Java连接池技术助力数据库性能飞跃
在Java应用开发中,数据库操作常成为性能瓶颈。频繁的数据库连接建立和断开增加了系统开销,导致性能下降。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接,显著减少连接开销,提升系统性能。文章详细介绍了连接池的优势、选择标准、使用方法及优化策略,帮助开发者实现数据库性能的飞跃。
33 4
|
1月前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
46 1
WK
|
1月前
|
安全 Java 编译器
C++和Java哪个更好用
C++和Java各具优势,选择取决于项目需求、开发者偏好及目标平台特性。C++性能出色,适合游戏、实时系统等;Java平台独立性强,适合跨平台、安全敏感应用。C++提供硬件访问和灵活编程范式,Java有自动内存管理和丰富库支持。两者各有千秋,需根据具体需求选择。
WK
43 1
|
2月前
|
IDE Java 程序员
C++ 程序员的 Java 指南
一个 C++ 程序员自己总结的 Java 学习中应该注意的点。
26 5
|
2月前
|
存储 缓存 算法
提高 Java 数组性能的方法
【10月更文挑战第19天】深入探讨了提高 Java 数组性能的多种方法。通过合理运用这些策略,我们可以在处理数组时获得更好的性能表现,提升程序的运行效率。
44 2
|
3月前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
501 37
|
2月前
|
缓存 Java 数据库连接
使用 NCache 将 Java 微服务扩展到极致性能
使用 NCache 将 Java 微服务扩展到极致性能
38 8