我对 Java 比较陌生,我很好奇 Java 在普通任务上的表现如何与 C++ 相比。因此,我比较了 2 种 C++ 字符串格式化方法(sprintf 和 ostringstream)与使用 Java 的 StringBuilder。对于每个可执行文件,我传递的第一个参数是要测量的迭代次数,所以所有代码看起来大致像
int numIterations = args[0]; // or argv[1] in C++
// measure begin here, ie:
int begin = System.nanoTime();
// loop to measure
for (int i = 0; i < numIterations; ++i)
{
// formatting code
}
// measure end here, ie
int end = System.nanoTime();
这与我看到其他人分析 Java 代码的方式一致。我注意到对于少量的迭代(比如 1000 次),Java 的表现很差。对于较大数量的迭代,(比如 1,000,000)Java 表现相对较好:
1000 次迭代
$ ./spf.out 1000
C++ took: 1412618 ns
$ ./oss.out 1000
C++ took: 1816222 ns
$ java StringBuilderTest 1000
Java took: 25787951 ns
1000000 次迭代
$ ./spf.out 1000000
C++ took: 1658699148 ns
$ ./oss.out 1000000
C++ took: 2053606449 ns
$java StringBuilderTest 1000000
Java took: 595965442 ns
我怀疑使用开始/结束计时器来分析 java 代码的方法,因为我不确定 JITer 的工作原理。这是衡量 Java 代码的有效方法吗?当使用 JIT'er 运行代码时,Java 是否有更多的“热身”工作?分析 Java 代码的规范方法是什么。有没有办法在测量性能之前预热 JITer?或者只是理解对于小 N JITing 将成为测量的性能数字的一部分?