有憑有據(jù) C語言真的比Java快?
上周51CTO報(bào)道了一篇《衰亡? 15歲的Java才到青春期》的文章,爭(zhēng)議很大,網(wǎng)友們分成了“Java紅”和“Java黑”。今天小編由在某人的博客中看到一篇文章,以這篇文章的內(nèi)容做個(gè)引子開個(gè)頭,他比較了很多語言的運(yùn)行速度,包括Ruby、Io、 PHP、Python、Lua、Java、Perl、Applescript、TCL、Javascript、OCaml、Ghostscript和C等。數(shù)據(jù)如下:
語言 | 時(shí)間 | 相對(duì)速度 |
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 |
但是接著我發(fā)現(xiàn)他用的是Java的老版本而且只實(shí)驗(yàn)了一次,這實(shí)際上并不能夠真實(shí)地體現(xiàn)Java的速度。
于是我迅速寫了點(diǎn)代碼運(yùn)行100三次,并用我認(rèn)為 “快”的方式運(yùn)行(其實(shí)還有更快的,只是我比較懶沒有設(shè)定)。結(jié)果如下:
- $ java -server -XX:CompileThreshold=1 Mandelbrot 2>/dev/null
- Java Elapsed 2.994
- Java Elapsed 1.926
- Java Elapsed 1.955
- $ gcc -O8 mandelbrot.c
- $ ./a.out 2>/dev/null
- C Elapsed 2.03
- C Elapsed 2.04
- C Elapsed 2.05
C仍然贏得了***輪,但接下來的兩次明顯Java快。
當(dāng)然,結(jié)果會(huì)因?yàn)榇a和機(jī)器的不同而不一樣,但有一點(diǎn)可以確定:Java運(yùn)行相當(dāng)快。
這次測(cè)試用的版本是Java 1.6.0—b105 和gcc 4.1.2,用的電腦是蘋果,內(nèi)核是酷睿雙核2.33GHz ,Linux操作系統(tǒng)。我測(cè)試用的代碼為:
Java測(cè)試用的代碼
- import java.util.*;
- class Mandelbrot
- {
- static int BAILOUT = 16;
- static int MAX_ITERATIONS = 1000;
- private static int iterate(float x, float y)
- {
- float cr = y-0.5f;
- float ci = x;
- float zi = 0.0f;
- float zr = 0.0f;
- int i = 0;
- while (true) {
- i++;
- float temp = zr * zi;
- float zrzr2 = zr * zr;
- float zizi2 = zi * zi;
- zr = zr2 - zi2 + cr;
- zi = temp + temp + ci;
- if (zi2 + zr2 > BAILOUT)
- return i;
- if (i > MAX_ITERATIONS)
- return 0;
- }
- }
- public static void run2()
- {
- int x,y;
- for (y = -39; y < 39; y++) {
- System.err.print("\n");
- for (x = -39; x < 39; x++) {
- if (iterate(x/40.0f,y/40.0f) == 0)
- System.err.print("*");
- else
- System.err.print(" ");
- }
- }
- }
- public static void run() {
- Date d1 = new Date();
- for (int i = 0; i < 100; i++) run2();
- Date d2 = new Date();
- long diff = d2.getTime() - d1.getTime();
- System.out.println("\nJava Elapsed " + diff/1000.0f);
- }
- public static void main(String args[]) {
- run();
- run();
- run();
- }
- }
C測(cè)試用的代碼
- #include <stdio.h>
- #import <sys/time.h>
- #define BAILOUT 16
- #define MAX_ITERATIONS 1000
- int mandelbrot(float x, float y)
- {
- float cr = y - 0.5;
- float ci = x;
- float zi = 0.0;
- float zr = 0.0;
- int i = 0;
- while(1) {
- i ++;
- float temp = zr * zi;
- float zrzr2 = zr * zr;
- float zizi2 = zi * zi;
- zr = zr2 - zi2 + cr;
- zi = temp + temp + ci;
- if (zi2 + zr2 > BAILOUT)
- return i;
- if (i > MAX_ITERATIONS)
- return 0;
- }
- }
- void run2() {
- int x,y;
- for (y = -39; y < 39; y++) {
- fputs("\n", stderr);
- for (x = -39; x < 39; x++) {
- int i = mandelbrot(x/40.0, y/40.0);
- if (i==0)
- fputs("*", stderr);
- else
- fputs(" ", stderr);
- }
- }
- fputs("\n", stderr);
- }
- void run() {
- struct timeval aTv;
- gettimeofday(&aTv, NULL);
- long init_time = aTv.tv_sec;
- long init_usec = aTv.tv_usec;
- int i;
- for (i = 0; i < 100; i++)
- run2();
- gettimeofday(&aTv,NULL);
- double query_time = (aTv.tv_sec - init_time) +
- (double)(aTv.tv_usec - init_usec)/1000000.0;
- printf ("C Elapsed %0.2f\n", query_time);
- }
- int main (int argc, const char * argv[]) {
- run();
- run();
- run();
- }
其次,我還在Rhino編輯器上運(yùn)行了JS的測(cè)試:
- $ java -cp rhino1_6R5/js.jar -server -XX:CompileThreshold=1
- org.mozilla.javascript.tools.shell.Main -O 9 mandelbrot.js 2>/dev/null
- JavaScript Elapsed 21.95
- JavaScript Elapsed 17.039
- JavaScript Elapsed 17.466
- JavaScript Elapsed 17.147
在這個(gè)測(cè)試中,JS比C慢九倍。如果CPU的速度沒18個(gè)月翻一番,那么2007年JS的運(yùn)行速度就趕上2002 C 的速度了。
后來在C語言的測(cè)試中加了些cpp,-march=pentium4發(fā)揮了點(diǎn)作用,但結(jié)果還是比Java慢:
- $ gcc -O9 -march=pentium4 mandelbrot2.c
- $ ./a.out 2>/dev/null
- C Elapsed 1.99
- C Elapsed 1.99
- C Elapsed 1.99
當(dāng)然,這只是做了一個(gè)小測(cè)試,聽朋友說在Solaris下Java的速度最快!
【編輯推薦】
- 衰亡? 15歲的Java才到青春期
- 8月編程語言排行榜:微軟鋒利的刀C#
- 淺析java、C#、C++及VC之間關(guān)系
- Java和C++區(qū)別
- Java、.Net、PHP、Ruby優(yōu)劣勢(shì)概覽
- Java語言深入:C#與Java相似之處的對(duì)比
- 3G與IPTV是發(fā)展大方向