Java与C简单性能测试

时间:2010-11-03 22:09:02

标签: java c performance printing comparison

运行一个简单的循环,在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

3 个答案:

答案 0 :(得分:6)

这似乎不对。你能提供你的代码吗?

我的版本:

使用gcc -std=c99 -o itr itr.cgcc 4.5.1

编译的C版本
#include <stdio.h>

int main( int argc, char **argv )
{
    for ( int i = 0; i < 1000000; i++ )
    {
        printf("%d\n", i);
    }
}

Java版本编译为javac Itr.javajavac 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)

  1. 如果不提供代码和环境设置,则您的测试没有任何价值。
  2. 您确定NetBeans控制台显示在C情况下不会减慢,还是针对Java输出进行了优化?
  3. 您确定在没有调试的情况下以优化模式运行了两个项目吗? C调试版本通常会生成大量调试信息,如果您正在调试,这些信息会明显减慢所有内容的速度。无论如何,任何基准测试都应该通过优化和无调试模式来完成。