【发布时间】:2016-11-07 19:09:06
【问题描述】:
我过度使用三元运算符,有时甚至用它替换非常简单的 if 语句。例如,我刚刚发现自己替换了这样的东西:
if (foo != null) {
bar = foo;
}
用这个:
bar = (foo == null) ? bar : foo;
虽然哪个读起来更好看是一个品味问题,但我想知道:
- 在这种情况下,三元版本的性能是否更差?
- 还有什么其他理由反对在这里使用三元吗?
我认为这里的性能可能会更差的原因是,我假设编译器无法针对 foo 为 null 时优化三进制。因此,bar 的值可能会再次设置为相同的值,从而浪费一些 CPU 时间,而简单的if 语句将永远无法达到这一点。但我对编译器和执行的知识有限,因此提出了这个问题。
【问题讨论】:
-
在某些条件下“崩溃”为
bar = bar的想法对我来说很奇怪。前者(带有if语句)更冗长,但更具可读性和清晰性。我的 0.02 美元 -
您已经回答了自己的问题。这是三元运算符的“开销”和不方便的使用。
-
创建一个无所事事的自分配是代码异味。三元运算符旨在减少 if-else 赋值的膨胀。如果没有别的,就真的不需要用了。
-
有点切题,担心这两个语句之间的编译/运行时间差异可能比它的价值更麻烦。我认为确保您的代码在其操作中完全一致比担心几微秒的操作更有趣。例如,有人会想“为什么甜蜜的圣诞节在这里有一个三元运算”?如果是这样,可能使用标准成语。在大多数情况下,开发人员时间的秒数 > 处理时间的微秒。
-
是的...我自己也过度使用了三元运算符(通常是嵌套的、多行的东西),但这对我来说仍然很奇怪。对我来说,优点是编译器检查保证在任何分支中都返回一个值,并且它让我能够区分“功能性”构造和“命令式”构造。不过,我没有看到你这样做……也许你在最初分配给
bar时使用了它,而不是?
标签: java performance variables variable-assignment ternary