有凭有据 C语言真的比Java快?

上周报道了一篇《衰亡? 15岁的Java才到青春期》的文章,争议很大,网友们分成了“Java红”和“Java黑”。今天小编由在某人的博客中看到一篇文章,以这篇文章的内容做个引子开个头,他比较了很多语言的运行速度,包括Ruby、Io、 PHP、Python、Lua、Java、Perl、Applescript、TCL、Javascript、OCaml、Ghostscript和C等。数据如下:

语言时间相对速度
ocaml compiled 3.09.20.05 seconds1.00 x
SBCL 1.0.20.13 seconds2.43 x
C gcc-4.0.10.14 seconds2.67 x
Java 1.4.20.39 seconds7.49 x
Lua 5.11.25 seconds23.81 x
Io 20070410 Vector1.37 seconds26.13 x
ocaml bytecode 3.09.23.75 seconds71.48 x
Python 2.5.19.99 seconds190.33 x
Ghostscript 8.5111.79 seconds224.51 x
Perl 5.8.6 Optimized12.37 seconds235.57 x
TCL 8.4 Optimized16.00 seconds304.76 x
Perl 5.8.621.75 seconds414.29 x
PHP 5.1.423.10 seconds440.05 x
Javascript SpiderMonkey v1.631.14 seconds593.10 x
Ruby 1.8.433.05 seconds629.54 x
Emacs Lisp47.00 seconds895.24 x
Applescript71.75 seconds1366.67 x
Io 2007041085.44 seconds1627.47 x

 
可以看到Java几乎比C慢两倍!

但是接着我发现他用的是Java的老版本而且只实验了一次,这实际上并不能够真实地体现Java的速度。

于是我迅速写了点代码运行100三次,并用我认为 “快”的方式运行(其实还有更快的,只是我比较懒没有设定)。结果如下:

 
 
 
  1.              
  2. $ java -server -XX:CompileThreshold=1 Mandelbrot 2>/dev/null  
  3.               
  4.             Java Elapsed 2.994  
  5.               
  6.             Java Elapsed 1.926  
  7.               
  8.             Java Elapsed 1.955  
  9.               
  10. $ gcc -O8 mandelbrot.c  
  11.               
  12.             $ ./a.out 2>/dev/null  
  13.               
  14.             C Elapsed 2.03  
  15.               
  16.             C Elapsed 2.04  
  17.               
  18.             C Elapsed 2.05  
  19.              

C仍然赢得了***轮,但接下来的两次明显Java快。

当然,结果会因为代码和机器的不同而不一样,但有一点可以确定:Java运行相当快。

这次测试用的版本是Java 1.6.0—b105 和gcc 4.1.2,用的电脑是苹果,内核是酷睿双核2.33GHz ,Linux操作系统。我测试用的代码为:

Java测试用的代码

 
 
 
  1. import java.util.*;   
  2. class Mandelbrot  
  3.               
  4.             {    
  5.               
  6.             static int BAILOUT = 16;  
  7.               
  8.             static int MAX_ITERATIONS = 1000;              
  9.      private static int iterate(float x, float y)  
  10.               
  11.             {  
  12.               
  13.             float cr = y-0.5f;  
  14.               
  15.             float ci = x;  
  16.               
  17.             float zi = 0.0f;  
  18.               
  19.             float zr = 0.0f;  
  20.               
  21.             int i = 0;  
  22.               
  23.             while (true) {  
  24.               
  25.             i++;  
  26.               
  27.             float temp = zr * zi;  
  28.               
  29.             float zrzr2 = zr * zr;  
  30.               
  31.             float zizi2 = zi * zi;  
  32.               
  33.             zr = zr2 - zi2 + cr;  
  34.               
  35.             zi = temp + temp + ci;  
  36.               
  37.             if (zi2 + zr2 > BAILOUT)  
  38.               
  39.             return i;  
  40.               
  41.             if (i > MAX_ITERATIONS)  
  42.               
  43.             return 0;  
  44.               
  45.             }  
  46.               
  47.             }   
  48.      public static void run2()  
  49.               
  50.             {  
  51.               
  52.             int x,y;  
  53.               
  54.             for (y = -39; y < 39; y++) {  
  55.               
  56.             System.err.print("\n");  
  57.               
  58.             for (x = -39; x < 39; x++) {  
  59.               
  60.             if (iterate(x/40.0f,y/40.0f) == 0)   
  61.               
  62.             System.err.print("*");  
  63.               
  64.             else  
  65.               
  66.             System.err.print(" ");  
  67.               
  68.             }  
  69.               
  70.             }            
  71.               
  72.             }  
  73.   public static void run() {  
  74.               
  75.             Date d1 = new Date();  
  76.               
  77.             for (int i = 0; i < 100; i++) run2();  
  78.               
  79.             Date d2 = new Date();  
  80.               
  81.             long diff = d2.getTime() - d1.getTime();  
  82.               
  83.             System.out.println("\nJava Elapsed " + diff/1000.0f);  
  84.               
  85.             }   
  86.             public static void main(String args[]) {  
  87.               
  88.             run();  
  89.               
  90.             run();  
  91.               
  92.             run();  
  93.               
  94.             }  
  95.               
  96.             } 

C测试用的代码

 
 
 
  1. #include  
  2. #import  
  3. #define BAILOUT 16  
  4. #define MAX_ITERATIONS 1000  
  5. int mandelbrot(float x, float y)  
  6. {  
  7. float cr = y - 0.5;  
  8. float ci = x;  
  9. float zi = 0.0;  
  10. float zr = 0.0;  
  11. int i = 0;  
  12. while(1) {  
  13. i ++;  
  14. float temp = zr * zi;  
  15. float zrzr2 = zr * zr;  
  16. float zizi2 = zi * zi;  
  17. zr = zr2 - zi2 + cr;  
  18. zi = temp + temp + ci;  
  19. if (zi2 + zr2 > BAILOUT)  
  20. return i;  
  21. if (i > MAX_ITERATIONS)  
  22. return 0;  
  23. }        
  24. }  
  25. void run2() {  
  26. int x,y;  
  27. for (y = -39; y < 39; y++) {  
  28. fputs("\n", stderr);  
  29. for (x = -39; x < 39; x++) {  
  30. int i = mandelbrot(x/40.0, y/40.0);  
  31. if (i==0)  
  32. fputs("*", stderr);  
  33. else  
  34. fputs(" ", stderr);  
  35. }           
  36. }  
  37. fputs("\n", stderr);  
  38. }  
  39. void run() {  
  40. struct timeval aTv;  
  41. gettimeofday(&aTv, NULL);  
  42. long init_time = aTv.tv_sec;  
  43. long init_usec = aTv.tv_usec;  
  44. int i;  
  45. for (i = 0; i < 100; i++)  
  46. run2();  
  47. gettimeofday(&aTv,NULL);  
  48. double query_time = (aTv.tv_sec - init_time) +   
  49. (double)(aTv.tv_usec - init_usec)/1000000.0;      
  50. printf ("C Elapsed %0.2f\n", query_time);  
  51. }  
  52. int main (int argc, const char * argv[]) {  
  53. run();  
  54. run();  
  55. run();  

其次,我还在Rhino编辑器上运行了JS的测试:

 
 
 
  1. $ java -cp rhino1_6R5/js.jar -server -XX:CompileThreshold=1   
  2.               
  3.             org.mozilla.javascript.tools.shell.Main -O 9 mandelbrot.js 2>/dev/null  
  4.               
  5.             JavaScript Elapsed 21.95  
  6.               
  7.             JavaScript Elapsed 17.039  
  8.               
  9.             JavaScript Elapsed 17.466  
  10.               
  11.             JavaScript Elapsed 17.147 

在这个测试中,JS比C慢九倍。如果CPU的速度没18个月翻一番,那么2007年JS的运行速度就赶上2002 C 的速度了。

后来在C语言的测试中加了些cpp,-march=pentium4发挥了点作用,但结果还是比Java慢:

 
 
 
  1.               
  2. $ gcc -O9 -march=pentium4 mandelbrot2.c  
  3.               
  4.             $ ./a.out 2>/dev/null  
  5.               
  6.             C Elapsed 1.99  
  7.               
  8.             C Elapsed 1.99  
  9.               
  10.             C Elapsed 1.99  
  11.               

当然,这只是做了一个小测试,听朋友说在Solaris下Java的速度最快!

【编辑推荐】

  1. 衰亡? 15岁的Java才到青春期
  2. 8月编程语言排行榜:微软锋利的刀C#
  3. 浅析java、C#、C++及VC之间关系
  4. Java和C++区别
  5. Java、.Net、PHP、Ruby优劣势概览
  6. Java语言深入:C#与Java相似之处的对比
  7. 3G与IPTV是发展大方向

分享名称:有凭有据 C语言真的比Java快?
转载来于:http://www.hantingmc.com/qtweb/news45/431695.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联