老问题新测试:java和C单机性能比较

09-09-08 banq
Java和C最大的不同是在于Java的可伸缩性Scalable,能够平滑发展到分布式云计算平台,通过云计算能够处理不断增长的业务访问量,这个代价过程是非常小容易的。

那么在单机环境下,Java过去一直被认为低于C程序,最近老外做了一个实验,进行了比较:

String Hash案例

Complete C++ code: http://pastebin.com/d280c1cd4

Complete Java code: http://pastebin.com/m541c4655

主要核心程序如下,是一个循环:

int h=0;
  for( int i=0; i<len; i++ )
    h = 31*h+str[i];
  return h;
<p>

在新的x86上运行100 million 循环,结果如下:

> a.out 100000000

100000000 hashes in 5.636362 secs

> java str_hash 100000000

100000000 hashes in 5.745 secs

两者相差无多,据作者介绍,如果在老版本的gcc & Java比较,Java会比C快15%,但这次是C++ 要快2%。

筛选案例

Complete C++ code: http://pastebin.com/m3784c090

Complete Java code: http://pastebin.com/m4b414295

核心代码如下:

bool *sieve = new bool[max];
  for (int i=0; i<max; i++) sieve[i] = true;
  sieve[0] = false;
  sieve[1] = false;
  int lim = (int)sqrt(max);
  for (int n=2; n<lim; n++) {
    if (sieve[n]) {
      for (int j=2*n; j<max; j+=n)
        sieve[j] = false;
    }
  }
<p>

测试结果:

> a.out 100000000

100000000 primes in 1.568016 secs

> java sieve 100000000

100000000 primes in 1.548 secs

Java要快些。

Profiling Enables Big Gains案例

Complete C code:

vcall.cpp http://pastebin.com/m70dbe7d6

vcall.hpp http://pastebin.com/m13055a8c

A.cpp http://pastebin.com/m5aa1b232

B.cpp http://pastebin.com/m2e46ec23

Complete Java code:

vcall.java http://pastebin.com/m149bbdf0

A.java http://pastebin.com/m2e33d6df

B.java http://pastebin.com/m2b1d75bb

核心代码是:

int sum=0;
    for (int i = 0; i < max; i++) 
      sum += val();  // virtual call
    return sum;
<p>

在同样x86上测试结果:

> a.out 1000000000 0

1000000000 adds in 2.657645 secs

> java vcall 1000000000 0

1000000000 adds in 0.0 secs

Java几乎是无限地快,至少可以说明Java不比C慢,甚至在某些情况下快于C,那种认为java比C慢的观点应该扔到垃圾堆里去了。

原文:

Java vs C performance... again...

[该贴被banq于2009-09-08 11:21修改过]

         

banq
2009-09-08 16:59
Tiobe 2009年9月编程排行榜:

TIOBE Programming Community Index for September 2009

Java和C排名第一第二,PHP进入第三名。

所以,目前C还是Java的强劲对手,脚本语言PHP是最大竞争对手,其他脚本Ruby Scala Groovy先把PHP打败再说了,还没构成对Java的威胁。

再推及一篇认为编译型长开发周期语言才是真正杀手:Long development cycles of compiled languages the real killer

文中认为:动态语言之所以快,是因为省却了测试和调试环节,如果加上这个环节,他们不一定比Java快速开发,静态语言可以通过编译器帮助解决很多错误和BUG,给程序员来更多抽象思维面向业务建模设计的空间和时间精力。

[该贴被banq于2009-09-08 17:05修改过]

[该贴被banq于2009-09-08 17:55修改过]

bloodrate
2009-09-09 09:10
我记得java比C快的 一个原因在于java可优化性强,虽然java要多经过虚拟机解释一次,但是经过优化后的jvm可能将一次系统级操作翻译成更少的CPU指令,比如同样作某个操作,jvm提供的CPU指令是10条,可能C提供的虚拟机指令是30条,这种情况下,多进行一次翻译带来的性能损失显得微不足道。

banq
2009-09-09 13:36
Blooadrate分析有道理。

所以选用C和Java,不应该以性能方面为主要标准,而是根据业务特点。

ACoder
2009-09-23 09:50
我觉得这种比较没有任何的意义,C++各种编译器本身的效率都是不同,一样的代码,在同样的windows平台上,用VC编译的结果运行要比用Intel编译运行的结果要慢10%,而且C++可以通过一些方法提高效率,java估计没有什么方法能再提高了,只能依赖于jre的执行效率了。

猜你喜欢