6

要编写一个好的比较测试测试,您必须运行它数千(数百万)次。它将(在大多数情况下)平衡其他程序的影响。

但是如果 JVM 可以影响结果。例如:

第一个解决方案是:

    final StringBuilder stringBuilder = new StringBuilder();
    stringBuilder.append(getStrOne());
    stringBuilder.append(getStrTwo());
    final String result1 = stringBuilder.toString();

第二个是:

    final String result2 = getStrOne() + getStrTwo();

我不知道哪个更好,因为 JVM 会影响结果。如何知道哪个更好?

更新:我的意思并不完全附加的组合测试。我问的是这样一个难以测试的情况

4

2 回答 2

2

我最近执行了一些基准测试,这些测试依赖于在此处找到的优秀 IBM 文章:http: //www.ibm.com/developerworks/java/library/j-benchmark1/index.html

本文描述了许多可能影响结果准确性的陷阱,例如:

  • 代码的运行时优化/重新编译。
  • 死代码消除(即未使用的结果可能导致您的测试代码被删除)
  • 垃圾收集
  • 缓存
  • ...

最后,文章链接到一个可以下载框架的站点。该框架在后台处理测试方法、寻找重新编译的证据和等待执行时间确定方面做得非常好。

于 2013-03-08T12:57:59.163 回答
0

如果是 2 个字符串,性能差异可以忽略不计,但请尝试以下操作:

String s = "";
for( int i = 0; i < 10000; i++ ) {
  s += i;
}

对比

StringBuilder b = new StringBuilder();
for( int i = 0; i < 10000; i++ ) {
  b.append(i);
}

你会发现第二个循环要快得多。为什么?因为字符串连接会String在每次迭代中创建一个新对象,这会浪费 CPU 周期和内存。

我会引用你的:

要编写一个好的比较测试测试,您必须对其进行数千(百万)次测试。它将(在大多数情况下)平衡其他程序的影响。

这同样适用于单个 VM 中的测试:多次测试您的代码、使用更大的数据、更大的循环等。由于计时精度错误和其他影响(例如,两者之间运行的垃圾收集),只比较小部分没有意义。

于 2013-03-08T12:57:09.687 回答