Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java比C快_Java_C_Performance - Fatal编程技术网

Java比C快

Java比C快,java,c,performance,Java,C,Performance,今天我做了一个简单的测试来比较java和c之间的速度——一个简单的循环,使整数“I”从0增加到20亿 我真的希望c语言比java更快。我对结果感到惊讶: java所需的时间(秒):约为1.8秒 c所需的时间(秒):约为3.6秒 我不认为java是一种更快的语言,但我也不明白为什么在我的简单程序中循环速度是c的两倍? 我在节目中犯了一个关键的错误吗?或者MinGW的编译器配置不好还是什么 public class Jrand { public static void main (String[

今天我做了一个简单的测试来比较java和c之间的速度——一个简单的循环,使整数“I”从0增加到20亿

我真的希望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);
 }

}
公共类Jrand{
公共静态void main(字符串[]args){
long startTime=System.currentTimeMillis();
int i;
对于(i=0;i<2000000000;i++){
//什么都不要做!
}
long-endTime=System.currentTimeMillis();
浮动总时间=(结束时间-开始时间);
系统输出打印项次(“时间:+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;
}
#包括
#包括
#包括
int main(){
时钟开始时间;
开始时间=时钟();
int i;

对于(i=0;iJava在消除不起任何作用的代码方面更为积极。不太可能假设开发人员知道他们在做什么。你不是在计时循环,而是Java检测和消除循环所需的时间

简言之,Java通常在不做任何有用的事情时速度更快


此外,您可能会发现,如果您优化C代码并删除调试信息,它也会做同样的事情,很可能会更短。

使用除
-O0
以外的任何优化级别重建您的C版本(例如
-O2
)你会发现它只需要0秒就可以运行,所以Java版本什么都不做需要1.6秒,而C版本需要0.0秒(实际上,大约是0.00005秒)什么都不做。

如果你想对此进行基准测试,而不是什么都不做,那么试着做一些有用的事情,比如在每次迭代中计算一些东西。例如,计算其他变量中的循环,并确保在最后使用它(例如,通过打印),这样它就不会被优化

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


编译器优化的范围非常大,您刚刚遇到了最基本的一个问题—消除无用代码:)

在Java中,循环很可能被忽略。尝试在循环中做一些有意义的事情,比如更新求和并在循环后打印。另请参阅Optimizer。正如Sanjay所说,您是否启用了C构建的优化?我猜您可能没有,因为否则,您的C代码应该返回0秒。本质上,它从来都不是case语言A比语言B快。但是,语言A中的程序X可能比语言B中的程序Y快。“我不认为java是一种更快的语言”,不管证据如何,都坚持教条。很好(!)任何像样的C编译器肯定不会为无用的循环生成任何代码,除非您有意禁用优化功能进行编译,这是一种单步执行程序并能够理解抽象机器流程的工具。可能在他的系统上。在我的旧笔记本电脑(Core 2 Duo)的第一次运行中Java版本需要0.059秒…这只是JVM的启动时间,可能是磁盘IO。以防万一这里有Java Basher。谢谢!我使用了-O2并在循环中添加了一个简单的计算。c语言:0.0000…秒。Java:6.7秒。后者也可以被优化吗?@owlstead:0.059秒启动开销是充分的理由bash Java仍然如此。对于典型的帧速率/刷新率来说,它比帧时间长。这是VM的启动时间,在运行3次后,它降到了0.01。它需要启动一些线程以便在后台进行垃圾收集等。这可能会使它对需要较短运行时间的命令行应用程序不太有用,但仅此而已。它是al因此,对于每个网络连接(通过inetd、传统cgi等)运行一次的程序来说,问题相当严重。