频 道 直 达 - 新闻 - 读书 - 培训 - 教程 - 前沿 - 组网 - 系统应用 - 安全 - 编程 - 存储 - 操作系统 - 数据库 - 服务器 - 专题 - 产品 - 案例库 - 技术圈 - 博客 - BBS
51CTO.COM_中国领先的IT技术网站
找资料:

你来测测看 谁说C比Java快?

作者: 王玉磊 出处:Csdn  (  ) 砖  (  ) 好  评论 ( ) 条  进入论坛
更新时间:2007-06-07 09:44
关 键 词:C  Java  JS  速度
阅读提示:本文作者自己运用程序测试了C和Java,到底哪个运行速度快?他的论据充分吗?你不妨也来测测看,自己给出一个结果吧!

我之前在某人的博客中看到一篇文章,他比较了很多语言的运行速度,包括Ruby、Io、 PHP、Python、Lua、Java、Perl、Applescript、TCL、ELispe、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三次,并用我认为 “快”的方式运行(其实还有更快的,只是我比较懒没有设定)。结果如下:
 
$ 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快。
 
当然,结果会因为代码和机器的不同而不一样,但有一点可以确定:Java运行相当快。
 
这次测试用的版本是Java 1.6.0—b105 和gcc 4.1.2,用的电脑是苹果,内核是酷睿双核2.33GHz ,Linux操作系统。我测试用的代码为:
 
Java测试用的代码
 
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 zr2 = zr * zr;
float zi2 = 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测试用的代码
 

#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 zr2 = zr * zr;
float zi2 = 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编辑器上运行了JS的测试:
 
$ 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
 
在这个测试中,JS比C慢九倍。如果CPU的速度没18个月翻一番,那么2007年JS的运行速度就赶上2002 C 的速度了。
 
后来在C语言 的测试中加了些cpp,-march=pentium4发挥了点作用,但结果还是比Java慢:
 
$ gcc -O9 -march=pentium4 mandelbrot2.c
$ ./a.out 2>/dev/null
C Elapsed 1.99
C Elapsed 1.99
C Elapsed 1.99

【责任编辑:火凤凰 TEL:(010)68476606-8007】


发表
查看
我也说两句

匿名发表

(如果看不清请点击图片进行更换)


中 国 领 先 的 IT 技 术 网 站 ·
技 术 成 就 梦 想
·Java基础教程 (查看53147次)
·UML类图详解 (查看47544次)
·Java编程开发手册 (查看25519次)
·UML统一建模语言 (查看24906次)
·C#技术开发指南 (查看23253次)
·Java编程开发手册 (1195个砖)
·Java基础教程 (429个砖)
·C#技术开发指南 (306个砖)
·PB开发教程 (220个砖)
·.NET开发手册 (218个砖)
·Java编程开发手册 (653个好)
·Java基础教程 (570个好)
·.NET开发手册 (252个好)
·PB开发教程 (210个好)
·Delphi开发技术手册 (174个好)
订阅技术快讯
电子杂志下载
名称:网络安全精品应用黄皮书
简介:《2007精品网络安全黄皮书》包括了9个大类24个小类, 800余篇文章,内容包含了熊猫烧香病毒、DDOS攻击、ARP病等热点问题的介绍及解决方案。从病毒查杀、防范、系统、数据等各方面的安全设置到黑客技术的了解、防范,涉及到了安全应用的全部领域, 由浅至深内容全面。
名称:Vista精品应用黄皮书
简介:《Vista精品应用黄皮书》囊括了Vista的各方面内容。此次的精简版,是将里面的内容做了提取,便于用户下载和使用。内容包含了各种Vista的安装与实施、技巧与解析以及各种Vista相关学习文档和相关软件的安全下载。该电子书是了解和应用Vista人员必备的工具手册,并且也是第一本
名称:2006中国IT论坛精品集合
简介:本书由“51CTO论坛推广联盟”制作完成。书中所有内容均来自各联盟成员的论坛(网站)。制作本书的目的是为了集中大家的优势资源,将更多更精彩的内容带给广大技术爱好者。本书是联盟成立以来制作的第一本书。
关键字阅读
频道精选
主编信箱 热线:010-66476606 告诉我们您想看的:专题 文章
关于我们 | 诚聘英才 | 联系我们 | 网站大事 | 意见反馈 | 网站地图
Copyright©2005-2007 51CTO.COM 版权所有