论坛首页 入门技术论坛

JAVA真的比C快

浏览 5091 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (4) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-06-02  

起初只是为了弄清楚JAVA速度到底咋样的,做了两个测试,结果都表明,JAVA比C快 25%

 

我的测试环境,CPU:TK-55(1.8G)

                     操作系统:WINXP

                     C编译器:GCC 3.4.2

                     JAVA编译器:JKD1.6update13

 

测试1:算10000000000次循环累乘

JAVA版代码:

import java.io.IOException; 

public class test { 

public test() { 
    double k = 0; 
    for (int j = 0; j < 100; j++) { 
        for (int i = 0; i < 100000000; i++) { 
            k += 3.1415926 * i * j; 
        } 
    } 
    System.out.println(k); 
} 

public static void main(String[] args) throws IOException { 
    new test(); 
} 

}
C版代码: 
#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

int main() { 
    double k = 0; 
    for(int j=0;j<100;j++) 
        for (int i = 0; i < 100000000; i++) { 
             k += 3.1415926 * i*j; 
        } 
    printf("%f\n",k); 
    system("pause"); 
} 

 结果 JAVA用时52秒 C用时70秒。

 

测试2:

用递归算法算斐波那契第45项

JAVA代码:

public class test {	
                public static int Fibonacci(int n) {
		if (n < 2)
			return 1;
		else {
			return Fibonacci(n - 1) + Fibonacci(n - 2);
		}
	}

	public static void main(String[] argc) {
		System.out.println(Fibonacci(45));
	}

}

 

C代码:

#include <stdio.h>
#include <stdlib.h>
int Fibonacci(int n){
	if(n<2)
		return 1;
	else {
		return Fibonacci(n-1)+Fibonacci(n-2);
	}
}
int main(void) {
	printf("%d",Fibonacci(45));
	system("pause");
	return 0;
}

 

这次结果,JAVA 用时22秒  C用时29秒。

 

两次结果比较下来。JAVA都只占用了C的75%时间,也就是说JAVA比C快25%

我也用VC++6.0测试过。比GCC慢好多。

我也不清楚为什么,不过我真的好佩服SUN的那些计算机专家,做出来的东西真牛!

 

   发表时间:2009-06-02  
我是用表掐的时间。基本上1秒误差吧。
0 请登录后投票
   发表时间:2009-06-02  
Sun的虚拟机会对反复执行的代码做专门优化,所以使得这部分代码的速度会越来越快。
不过如果是第一次执行,或者执行的代码反复执行的次数比较少的话,是赶不上C的速度的。
0 请登录后投票
   发表时间:2009-06-03  
你这种比较肯定是有问题的。单单一个垃圾回收机制就对java的性能有很大影响
当然现在的java版本gc已经不是一个大问题了。
0 请登录后投票
   发表时间:2009-06-03  
魔力猫咪 写道
Sun的虚拟机会对反复执行的代码做专门优化,所以使得这部分代码的速度会越来越快。
不过如果是第一次执行,或者执行的代码反复执行的次数比较少的话,是赶不上C的速度的。



也许是吧,但GCC也优化了啊。
我用gcc -O3优化,结果几乎一样。
尤其是for 100000000000次循环的那个
每次循环都是累加的,还有乘法,根本就没什么捷径可以走。

是不是JAVA在对浮点型运算跟C处理的不一样啊。

JAVA到底是怎么做到的呢?

也许在大型运算里,JVM垃圾回收会是拖后腿的。

但是这个测试结果,在我看来JAVA几乎完成了不可能完成的任务。
0 请登录后投票
   发表时间:2009-06-04  
我的测试如下:
T5470(1.6G)  winxp gcc3.4.5  jdk1.50_11
算累乘:
C的时间59.5s
java的时间60.5s


0 请登录后投票
   发表时间:2009-06-04  
sun的HotSpot JVM是用C++写的,感觉不大可能超过C或C++
0 请登录后投票
   发表时间:2009-06-04  
jdk1.6
mingw32-gcc.exe (GCC) 3.4.5 (mingw-vista special r3)

javac Test.java
gcc -o test -O3 test.c

time ./test
real    0m8.797s
user    0m0.015s
sys     0m0.015s

time java -cp . Test
real    0m30.594s
user    0m0.031s
sys     0m0.000s


0 请登录后投票
   发表时间:2009-06-04  
不要拿这个来测试,写个server 或者引擎什么的来试试
0 请登录后投票
   发表时间:2009-06-04  
Sun的HotSpot虚拟机是由一家被Sun收购的Java编译器开发公司最早开发出来的。Sun收购后改名叫HotSpot,在发布前就声称可以超过C++和C。当然,在推出后是当时最快的虚拟机之一,但是并没有超过C。后来经过多次改进,速度开始接近并超过C。
主要原理是编译器可以根据运行情况,把Java代码进行动态编译优化。比如某一段代码调用特别频繁,就可以专门对这部分进行优化,产生更适合其运行的本地代码。根据现实运行情况编译的代码当然比C的静态编译代码更适合当时的情况,所以这部分代码跑得比C快不新鲜。无论任何时候,跑得最快的都是最适合当前情况的机器码。
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics