【发布时间】:2014-02-07 22:50:41
【问题描述】:
我做了和这篇文章一样的测试: new String() vs literal string performance
意思是我想测试哪个性能更好。正如我所料,结果是文字赋值更快。我不知道为什么,但是我用更多的分配进行了测试,我注意到一些奇怪的事情:当我让程序执行超过 10.000 次的循环时,文字分配相对而言并不比少于 10.000 次分配快得多.在 1.000.000 次重复时,它甚至比创建新对象还要慢。
这是我的代码:
double tx = System.nanoTime();
for (int i = 0; i<1; i++){
String s = "test";
}
double ty = System.nanoTime();
double ta = System.nanoTime();
for (int i = 0; i<1; i++){
String s = new String("test");
}
double tb = System.nanoTime();
System.out.println((ty-tx));
System.out.println((tb-ta));
我让它像上面写的那样运行。我刚刚学习 Java,我的老板让我做测试,在我展示测试结果后,他让我找到答案,为什么会发生这种情况。我在 google 或 stackoverflow 上找不到任何东西,所以我希望有人可以在这里帮助我。
factor at 1 repetition 3,811565221
factor at 10 repetitions 4,393570401
factor at 100 repetitions 5,234779103
factor at 1,000 repetitions 7,909884116
factor at 10,000 repetitions 9,395538811
factor at 100,000 repetitions 2,355514697
factor at 1,000,000 repetitions 0,734826755
谢谢!
【问题讨论】:
-
我强烈怀疑您只是看到 Hotspot 随着时间的推移更加优化。 “百万次重复”部分可能显示了其他一些因素......它真的不会更快。
-
查找 Hotspot 并牢记垃圾收集,以回答为什么您会看到执行次数较多时的差异。对于 Java 中的未来分配,很快就会忘记这种级别的优化。正如卡亚曼所说——担心这是浪费时间。衡量有意义的算法,但不要让这个结果影响你编写任何代码的方式!
标签: java string performance microbenchmark