编译器或JIT对Java的优化

4

我时常看到这样的代码:

if (id.split(":").length > 1) {
 sub_id = id.split(":")[1];
 parent_id = id.split(":")[0];
}

要做类似以下的事情不是更好(而且更快)吗?

String [] ids = id.split(":");
if (ids.length > 1) {
  sub_id = ids[1];
  parent_id = ids[0];
}

这样你就不必多次调用'split()',编译器/JIT会进行这样的优化吗?

优化引擎可以提高所用算法的性能,但据我所知,它不能用另一个算法替换你的代码。 - Thorbjørn Ravn Andersen
1
如果这不仅仅是一个理论问题,而是您真正需要优化代码的需求,我建议避免使用可正则表达式分割方法。使用 indexOf 查找 ':' 并使用两个 substring 调用来提取 ID 的每个部分应该比两种替代方案都要快得多。 - jarnbjo
1个回答

10

我肯定不会期望JIT或编译器执行这样的优化。它必须知道:

  • 结果在调用之间没有发生“有用”的变化
  • 没有任何东西会使用每个方法调用产生的单独数组的事实
  • 没有任何东西会使用每个方法调用产生的不同字符串对象的事实

看起来JIT或编译器都不太可能为此进行优化。

是的,使用第二种形式肯定更有效率-我认为它也更易读。当更易读的代码也更有效率时,这很清楚地表明要使用哪个代码 ;)


1
先测量,然后你就有了硬数据,而不是挥舞手臂。 - Thorbjørn Ravn Andersen
1
有时候我会觉得人们期望编译器比它实际上更聪明。 - OddBeck
1
@OddBeck:为什么你没有测试实际呈现的代码?这样做不是更简单和更有用吗? - Jon Skeet
1
@jarnbjo:那将是令人惊讶的 - 并且非常容易观察,只需比较引用即可。不过很想看到它正在发生的证据。 - Jon Skeet
1
@jarnbjo:没错,但这也是可能的,因为结果实际上无法区分。而使用String.split则不是这样。 - Jon Skeet
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接