`
px96004
  • 浏览: 4449 次
  • 性别: 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和C语言都是广泛使用的编程语言,但它们在性能上有显著的差异。C语言以其低级特性和直接操作硬件的能力而闻名,通常被...

    各种算法 java和c语言两种实现

    本压缩包文件"各种算法 java和c语言两种实现"提供了多种算法的Java和C语言版本,旨在帮助开发者深入理解这两种语言在处理算法时的不同方式和效率。 首先,Java是一种面向对象的高级编程语言,具有自动内存管理、...

    李兴华java视频和c语言,数据资料

    根据提供的文件信息,我们可以推断出这是一组与Java和C语言学习相关的资源链接集合。接下来,我们将基于这些信息深入探讨Java与C语言的基础概念、重要特性以及它们在实际开发中的应用价值。 ### Java编程语言 Java...

    C语言,java经典算法

    在编程领域,C语言和Java都是非常重要的编程语言,它们各自有着独特的特性和应用范围。C语言以其高效、灵活和贴近硬件的特点,常被用于系统级编程、嵌入式开发以及高性能计算;而Java则以其“一次编写,到处运行”的...

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

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

    DES加密算法(JAVA和C语言描述)结果一致

    标题"DES加密算法(JAVA和C语言描述)结果一致"表明我们将探讨如何在两种不同的编程语言——Java和C中实现DES加密,确保得到相同的加密结果。在跨语言实现加密算法时,一致性至关重要,因为这确保了无论在哪种环境下...

    Java 解析 Linux C结构体

    本话题主要关注的是如何在Java环境下解析由Linux C程序通过socket发送的结构体数据。这里我们涉及到的主要知识点包括Java的网络编程、C语言的结构体以及二进制数据的处理。 首先,让我们了解一下Java的网络编程。...

    将C头文件转为Java工具

    标题中提到的“将C头文件转为Java工具”是一个专为JNA设计的应用,它能够自动化地解析C头文件,并自动生成对应的Java接口,使得开发者可以更方便地利用JNA来调用C库。这个工具的使用通常包括以下几个步骤: 1. **...

    ( JAVA快速入门教程

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

    数据结构算法 java和c语言两种实现

    本资源包含用Java和C语言实现的数据结构算法,这两种语言在编程领域广泛应用,各有其特点和优势。 首先,Java是一种面向对象的、跨平台的编程语言,以其简洁的语法和自动内存管理闻名,适合开发大型企业级应用。而...

    c与Java的UDP收发

    标题“c与Java的UDP收发”指的是使用C语言和Java语言进行用户数据报协议(User Datagram Protocol, UDP)的通信。UDP是一种无连接的、不可靠的传输层协议,常用于实时应用,如音频、视频流传输,因为它提供快速的...

    数据结构 C C++ JAVA

    C、C++ 和 Java 都是广泛用于实现数据结构的编程语言,每种语言都有其独特的特性和优势。 在C语言中,由于其低级特性,可以直接对内存进行操作,这使得C语言在实现数据结构时更加灵活,但同时也需要开发者具有较高...

    jdk-17.0.1,Java17

    在Windows系统中,通常推荐将JDK安装在"C:\Program Files\Java"这样的标准路径下,解压后,开发者可以直接设置环境变量,如JAVA_HOME,Path等,以便于命令行调用Java编译器(javac)和Java虚拟机(JVM)。...

    Java编程快速入门

    与许多其他编程语言(包括C和C++)不同,Java编译后不是生成特定于平台的机器代码,而是生成平台独立的字节码。这些字节码通过网络分发,并由虚拟机(JVM)解释执行,无论在哪个平台上运行。 Java的设计简单易学。...

    java课程设计c/s结构的图书管理系统

    本项目是基于Java语言进行的C/S(客户端/服务器)架构的图书管理系统课程设计。C/S架构是一种常见的软件系统架构模式,它将应用分为客户端和服务器两部分,客户端负责用户交互,服务器则处理数据和业务逻辑。 ...

    基于C语言的java词法分析器

    在这个基于C语言实现的Java词法分析器中,我们探讨的核心技术包括C语言编程、正则表达式、有穷自动机(Finite State Automata, FSA)以及词法规则的定义。 首先,C语言是这个项目的编程基础。C语言以其高效、底层...

    java与c/c++的区别

    在语法上,Java 比 C/C++ 更加简洁,没有运算符重载,没有多重继承,而是采用了接口来实现多态。Java 还引入了异常处理、自动内存管理、垃圾回收等特性,使编程更加安全。而C/C++的异常处理需要手动管理,且对错误...

    数据结构C和java

    例如,链表在插入和删除操作上比数组快,但在随机访问上较慢;而数组在随机访问上快,但在插入和删除时可能需要移动大量元素。因此,在选择数据结构时,应根据具体的应用场景和需求来决定。 对于数据结构的学习,...

    MCU云快充协议C语言实现库软件源代码.zip

    MCU云快充协议C语言实现库软件源代码: #define FRAME_TYPE_0X01 0x01//充电桩登录认证 #define FRAME_TYPE_0X02 0x02 #define FRAME_TYPE_0X03 0x03//充电桩心跳包 #define FRAME_TYPE_0X04 0x04 #define FRAME_...

Global site tag (gtag.js) - Google Analytics