运行一个简单的循环,在java和c中打印出迭代器(i)1.000.000次。
我分别使用netbeans和visual studio。
我不关心精确度但是大约40秒:
netbeans(java)已经打印了大约500,000个数字 而windows(c)打印了大约75.000个数字
- 为什么会有这么大的差异?
即时通讯使用常见的intel core2duo(2.0 Ghz)pc与windows7
答案 0 :(得分:6)
这似乎不对。你能提供你的代码吗?
我的版本:
使用gcc -std=c99 -o itr itr.c
与gcc 4.5.1
#include <stdio.h>
int main( int argc, char **argv )
{
for ( int i = 0; i < 1000000; i++ )
{
printf("%d\n", i);
}
}
Java版本编译为javac Itr.java
,javac 1.6.0_20
,JVM为:
OpenJDK Runtime Environment (IcedTea6 1.9.1) (ArchLinux-6.b20_1.9.1-1-x86_64)
OpenJDK 64-Bit Server VM (build 17.0-b16, mixed mode)
代码 -
class Itr
{
public static void main( String[] av )
{
for ( int i = 0; i < 1000000; i++ )
{
System.out.println(i);
}
}
}
和时间:
time ./itr
// Snip Output //
real 0m1.964s
user 0m0.330s
sys 0m1.477s
time java Itr
// Snip Output //
real 0m5.245s
user 0m2.337s
sys 0m3.023s
测试系统是运行64位ArchLinux的英特尔酷睿i5 M520(@ 2.4GHz)。
答案 1 :(得分:2)
显着加速你的榜样的一种方法是:
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000000; i++)
sb.append(i).append("\n");
System.out.println(sb.toString());
}
循环中的字符串连接或输出(在您的情况下打印到标准输出流)是不好的设计而不是Java的错误,您通常希望避免这种情况。
如果最小化对输出的调用并使用本地缓冲区,则速度会快得多。连接字符串也是低效的 - Java为该任务提供了StringBuilder
类。
答案 2 :(得分:1)