【发布时间】:2014-09-21 16:18:31
【问题描述】:
我的想法是使用条件运算符将我的一些 if 块变成单行。但是,我想知道是否会有速度差异。我进行了以下测试:
static long startTime;
static long elapsedTime;
static String s;
public static void main(String[] args) {
startTime = System.nanoTime();
s = "";
for (int i= 0; i < 1000000000; i++) {
if (s.equals("")) {
s = "";
}
}
elapsedTime = System.nanoTime() - startTime;
System.out.println("Type 1 took this long: " + elapsedTime + " ns");
startTime = System.nanoTime();
s = "";
for (int i= 0; i < 1000000000; i++) {
s = (s.equals("") ? "" : s);
}
elapsedTime = System.nanoTime() - startTime;
System.out.println("Type 2 took this long: " + elapsedTime + " ns");
}
这是我的结果:
类型 1 花了这么长时间:3293937157 ns
Type 2 花了这么长时间:2856769127 ns
我在这里做错了吗?
假设s.equals("") 一定是正确的,这是使您的代码更快的可行方法吗?
【问题讨论】:
-
第一个似乎稍微慢,因为你正在创建和添加字符串
""到字符串池.在第二种情况下,它已经在字符串池中可用。所以,你节省了时间。尝试将startTime = System.nanoTime();放在s = "";之后的开头并检查。 编译器/JVM 可以更好地理解某些内容,并且取决于机器。不要依赖这样的基准。 -
另一件“小事”:在实施基准测试时 - 您应该提供“热身”。
-
尝试更改顺序并先执行 test2。结果:你最后运行的测试是最快的。
-
@alfasin 的第二个建议不仅仅是一件小事(我怀疑他知道 :))。你的第一个循环是从解释代码开始(例如
String.equals),然后编译和优化它。第二个循环无需执行任何工作即可获得所有这些好处。像这样的微基准在 Java 中是出了名的困难。我建议你阅读上面写过的许多页面(谷歌“java microbenchmark”)。 -
是的,你做错了几件事。第一个是过早的优化,第二个是思考如果是你的瓶颈。既然你已经用分析标记了你的问题,那么分析器告诉你什么是现实世界应用程序中最慢的代码?
标签: java if-statement benchmarking conditional-operator microbenchmark