`
px96004
  • 浏览: 4247 次
  • 性别: Icon_minigender_1
  • 来自: 大连
最近访客 更多访客>>
社区版块
存档分类
最新评论

JAVA真的比C快

阅读更多

起初只是为了弄清楚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的那些计算机专家,做出来的东西真牛!

 

分享到:
评论
14 楼 kxscr 2009-10-11  
单独的一个浮点运算测试能说明什么呢???
你在测试FPU???这和编程语言什么关系????
13 楼 rgrg 2009-06-07  
不要拿for循环测试,这个基本没有意义的,编译器都是对这些经过优化的。再者只凭一个例子就断定是不科学的。总体上讲Java是没有C快的,搞过ACM的应该深有体会。
12 楼 px96004 2009-06-05  
guooscar 写道
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





这个是什么测试啊???有源码么???
real
user
sys
都是什么意思啊?

请guooscar兄仔细解释解释呗。


无论任何时候,跑得最快的都是最适合当前情况的机器码。

恩。。。魔力猫咪  这句话让我有点头绪了。。。呵呵
11 楼 fivestarwy 2009-06-04  
HotSpot确实在某些方面做了优化(比如采用了一些牛B的算法),
但这些是典型的“空间换时间”,看看JVM内存消耗就知道了
上面的测试中GC基本上没工作,如果换一个内存低一些机子,
Java的速度局限性很容易体现出来
10 楼 guooscar 2009-06-04  
魔力猫咪 写道
Sun的HotSpot虚拟机是由一家被Sun收购的Java编译器开发公司最早开发出来的。Sun收购后改名叫HotSpot,在发布前就声称可以超过C++和C。当然,在推出后是当时最快的虚拟机之一,但是并没有超过C。后来经过多次改进,速度开始接近并超过C。
主要原理是编译器可以根据运行情况,把Java代码进行动态编译优化。比如某一段代码调用特别频繁,就可以专门对这部分进行优化,产生更适合其运行的本地代码。根据现实运行情况编译的代码当然比C的静态编译代码更适合当时的情况,所以这部分代码跑得比C快不新鲜。无论任何时候,跑得最快的都是最适合当前情况的机器码。



就拿楼主的例子来看,纯粹是乘法运算,不存在优化的可能,测试结果应该很公平,
然后看看测试结果,C语言比JAVA快3倍以上
这种纯暴力计算,java怎么可能比C快 == ==||
9 楼 魔力猫咪 2009-06-04  
Sun的HotSpot虚拟机是由一家被Sun收购的Java编译器开发公司最早开发出来的。Sun收购后改名叫HotSpot,在发布前就声称可以超过C++和C。当然,在推出后是当时最快的虚拟机之一,但是并没有超过C。后来经过多次改进,速度开始接近并超过C。
主要原理是编译器可以根据运行情况,把Java代码进行动态编译优化。比如某一段代码调用特别频繁,就可以专门对这部分进行优化,产生更适合其运行的本地代码。根据现实运行情况编译的代码当然比C的静态编译代码更适合当时的情况,所以这部分代码跑得比C快不新鲜。无论任何时候,跑得最快的都是最适合当前情况的机器码。
8 楼 iaimstar 2009-06-04  
不要拿这个来测试,写个server 或者引擎什么的来试试
7 楼 guooscar 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


6 楼 fivestarwy 2009-06-04  
sun的HotSpot JVM是用C++写的,感觉不大可能超过C或C++
5 楼 fivestarwy 2009-06-04  
我的测试如下:
T5470(1.6G)  winxp gcc3.4.5  jdk1.50_11
算累乘:
C的时间59.5s
java的时间60.5s


4 楼 px96004 2009-06-03  
魔力猫咪 写道
Sun的虚拟机会对反复执行的代码做专门优化,所以使得这部分代码的速度会越来越快。
不过如果是第一次执行,或者执行的代码反复执行的次数比较少的话,是赶不上C的速度的。



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

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

JAVA到底是怎么做到的呢?

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

但是这个测试结果,在我看来JAVA几乎完成了不可能完成的任务。
3 楼 kekeemx 2009-06-03  
你这种比较肯定是有问题的。单单一个垃圾回收机制就对java的性能有很大影响
当然现在的java版本gc已经不是一个大问题了。
2 楼 魔力猫咪 2009-06-02  
Sun的虚拟机会对反复执行的代码做专门优化,所以使得这部分代码的速度会越来越快。
不过如果是第一次执行,或者执行的代码反复执行的次数比较少的话,是赶不上C的速度的。
1 楼 px96004 2009-06-02  
我是用表掐的时间。基本上1秒误差吧。

相关推荐

    在什么情况下Java比C快?Java开发Java经验技巧共

    在什么情况下Java比C快?Java开发Java经验技巧共2页.pdf.zip

    C 语言中文网 Java、Swing、设计模式、Python、Golang 等十三本

    'Java Swing 教程:30 分钟玩转 Swing 界面设计(C 语言中文网).epub' 'Java 基础教程(C 语言中文网).epub' 'Java 设计模式:23 种设计模式全面解析(C 语言中文网).epub' 'JSP 教程:1 天玩转 JSP 网站开发技术...

    ( JAVA快速入门教程

    东方一峰编写的《JAVA快速入门教程》,讲述JAVA语言的基本知识,适合有C语言基础的读者快速掌握JAVA编程思想。

    Java 解析 Linux C结构体

    Linux C socket通信传输结构体消息,Java解析C语言结构体里的数据

    前台java 后台c 结合技术----JNI.docx

    前台java 后台c 结合技术----JNI @author:张宝东 @date:2020/4/1 目录 1问题调查 2java前台和c后台结合解决方案--jui介绍 3java前台Js画折线图和3d图 4jui入门测试 1问题...

    Java快速命令编译助手(JCR)

    这两个程序的区别是,一个会把生成的class文件统一放到C盘,另一个是在当前目录下生成一个class文件夹,凭自己习惯选择使用吧,你当然也可以再Java文件打开方式中加入本程序,会更方便! Test.java是我编写的一个例...

    Java实现的C语言试题生成与考试系统(源代码+论文),可用作毕业设计,课程设计

    此资源集包含了一套完整的Java实现的C语言试题生成与考试系统项目源代码、相关的毕业论文以及详尽的使用说明。它旨在提供一个全面、深入的学习和研究工具,适用于本科课程设计、毕业设计以及任何希望深入学习Java...

    JAVA上百实例源码以及开源项目

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    JAVA上百实例源码以及开源项目源代码

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    xxtea-java, Java的XXTEA加密算法库.zip

    xxtea-java, Java的XXTEA加密算法库 用于 Java 的 XXTEA 简介XXTEA是一种快速安全的加密算法。 这是一个用于Java的XXTEA库。它与原始的XXTEA加密算法不同。 它加密和解密字节 [] 而不是 32bit 整数 array,键也

    java基础入门教程

    3 Java 语 言 的 动 画 效 果 远 比 GUI技 术 更 加 逼 真 ,尤 其 是 利用WW W提 供 的 巨 大动 画 资 源 空 间 ,可 以 共 享 全 世 界 的 动 态 画面 的 资 源 。 4 软 件 最 终 产 品 :用 Java 语 言 开 发 的 ...

    java开源包6

    它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步...

    java开源包11

    它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步...

    java开源包9

    它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步...

    java多线程文件传输

    java多线程文件传输 java多线程文件传输

    java开源包101

    它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步...

    java开源包4

    它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步...

    从C/C++跳班到Java

    对于所有熟悉C/C++的Java新手,本文可当作一个轻松、随便和快速的参考个新类,可以这样编写代码: elass MyPo山t extel飞d Polnt//新的内容 从句法_L来讲,Java与C++相似。它有If、else、fol^、dO、whi抢和switch语句;有...

    java开源包5

    它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步...

    Java类文件加密专家

    采用纯C语言开发的内核算法,运行速度极快。 2.彻底保护您的Class二进制文件,任何通过分析Class文件结构来实现反编译的工具均不能对加密后的文件反编译。 使用方法 在要分发您的Java应用程序前,使用Java 类...

Global site tag (gtag.js) - Google Analytics