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

开发 后端
谁说C比Java快?本文无意要分出那种语言好,面对众多网友对“Java语言”的争议,本文对Java和C进行一个小测试,测试用的版本是Java 1.6.0—b105 和gcc 4.1.2,用的电脑是苹果,内核是酷睿双核2.33GHz ,Linux操作系统。

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

语言 时间 相对速度
ocaml compiled 3.09.2 0.05 seconds 1.00 x
SBCL 1.0.2 0.13 seconds 2.43 x
C gcc-4.0.1 0.14 seconds 2.67 x
Java 1.4.2 0.39 seconds 7.49 x
Lua 5.1 1.25 seconds 23.81 x
Io 20070410 Vector 1.37 seconds 26.13 x
ocaml bytecode 3.09.2 3.75 seconds 71.48 x
Python 2.5.1 9.99 seconds 190.33 x
Ghostscript 8.51 11.79 seconds 224.51 x
Perl 5.8.6 Optimized 12.37 seconds 235.57 x
TCL 8.4 Optimized 16.00 seconds 304.76 x
Perl 5.8.6 21.75 seconds 414.29 x
PHP 5.1.4 23.10 seconds 440.05 x
Javascript SpiderMonkey v1.6 31.14 seconds 593.10 x
Ruby 1.8.4 33.05 seconds 629.54 x
Emacs Lisp 47.00 seconds 895.24 x
Applescript 71.75 seconds 1366.67 x
Io 20070410 85.44 seconds 1627.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 <stdio.h> 
  2. #import <sys/time.h> 
  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是发展大方向

 

责任编辑:佚名 来源: 博客园
相关推荐

2021-11-11 06:57:00

PythonPyPy程序

2020-11-09 09:33:37

多线程

2021-09-30 07:26:15

磁盘IO网络

2022-11-02 08:12:47

TurbopackVite

2015-06-01 06:39:18

JavaJava比C++

2010-01-14 10:34:02

C++语言

2010-01-14 14:55:14

C++编译器

2010-01-26 09:24:53

C++语言

2010-01-15 16:45:35

C++语言

2010-01-20 17:23:03

C++编程语言

2010-01-18 11:12:36

2010-03-19 09:39:17

Python编程语言

2022-06-08 09:20:58

Python基准测试编程语言

2023-09-08 15:05:51

Mojo编程语言

2021-07-11 18:04:04

C语言

2022-10-27 08:31:31

架构

2010-01-14 17:52:02

2023-11-27 16:26:20

mainC语言

2023-05-15 07:20:24

2010-01-14 13:24:49

CC++语言
点赞
收藏

51CTO技术栈公众号