Java比C快
今天我做了一个简单的测试来比较java和c之间的速度——一个简单的循环,使整数“I”从0增加到20亿 我真的希望c语言比java更快。我对结果感到惊讶: java所需的时间(秒):约为1.8秒 c所需的时间(秒):约为3.6秒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的两倍? 我在节目中犯了一个关键的错误吗?或者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等)运行一次的程序来说,问题相当严重。