2013-09-16 53 views
6

今天我做了一个简单的测试来比较java和c之间的速度 - 一个简单的循环使得整数“i”从0增加到20亿。Java比C更快

我真的希望c语言比java更快。我对结果感到惊讶:

java所需时间:约1.8

c:约需要几秒钟的时间。 3.6秒。

我不认为java是一种更快的语言,但我不明白为什么在我的简单程序中循环速度是c的两倍?

我在程序中做了一个关键的错误?还是MinGW编译器配置不好或者什么的?

public class Jrand { 

public static void main (String[] args) { 

    long startTime = System.currentTimeMillis(); 
    int i; 
    for (i = 0; i < 2000000000; i++) { 
     // Do nothing! 
    } 
    long endTime = System.currentTimeMillis(); 
    float totalTime = (endTime - startTime); 

    System.out.println("time: " + totalTime/1000); 
} 

} 

的C程序

#include<stdio.h> 
#include<stdlib.h> 
#include <time.h> 
int main() { 

    clock_t startTime; 
    startTime = clock(); 

    int i; 
    for (i = 0; i <= 2000000000; i++) { 
     // Do nothing 
    } 
    clock_t endTime; 
    endTime = clock(); 

    float totalTime = endTime - startTime; 
    printf("%f", totalTime/1000); 

    return 0; 
} 
+3

的循环在Java中很可能被忽略。尝试在循环中做一些有意义的事情,比如更新总和并在循环之后打印它。另请参阅[本主题](http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java) –

+4

优化程序。正如桑杰说的。 – Devolus

+11

你打开了C构建的优化吗?我猜你可能没有,否则,你的C代码应该返回0秒。 – Mysticial

回答

21

使用除-O0以外的任何优化级别(例如-O2)重建您的C版本,您会发现它在0秒内运行。所以Java版本需要1.6秒才能做任何事情,而C版本则需要0.0秒(实际上约为0.00005秒)才能不做任何事情。

+7

也许在他的系统上。在我的旧笔记本电脑(Core 2 Duo)的第一次运行* Java版本需要0.059秒......这只是JVM的启动时间,可能是磁盘IO。以防万一有Java解析器在这里。 –

+0

谢谢!我使用了-O2并添加了一个简单的计算器。在循环内。 c语言:0.0000 ...秒。 Java:6.7秒。后者是否也可以优化? –

+0

@owlstead:启动开销为0.059秒是很多理由对Java进行打击。它比典型帧率/刷新率的帧时间更长。 –

10

Java是消除代码没有做任何事情更积极。开发人员不太可能知道他们在做什么。你没有计算循环,但需要多长时间才能检测并消除循环。

简而言之,Java无所事事通常会更快。

此外,您可能会发现,如果优化C代码并删除调试信息,它将执行相同的操作,最可能更短。

+6

除非您故意编译禁用优化,这是一种单步执行程序并能够理解抽象机的流程的工具,任何体面的C编译器肯定不会产生无用循环的代码。 –

1

如果你想以此为基准,而不是无所作为,可以尝试一些有用的东西,比如每次迭代计算一些东西。对于例如对其他变量中的循环进行计数,并确保在最后使用它(例如通过打印它),以便它不会被优化。

交替简单测试可以线性访问数组(只读),将元素从一个数组复制到另一个数组(读取+写入)或对数据执行一些操作。其中一些情况可能很有趣,因为它们会打开几个非常简单的编译器优化,您可以稍后在结果二进制/字节码中看到这些优化,例如循环展开,寄存器分配以及更复杂的向量化或代码运动等。在其他Java可以使用一些技巧厉害如jitting(动态重新编译上飞)

编译器优化的范围是巨大的,你刚刚遇到的最基本的一个 - 消除无用的代码:)