使用switch / if或嵌套三元运算符会更快吗?

时间:2014-09-10 20:46:07

标签: java performance

我只是想知道哪一个更快检查int值并将布尔值设置为正确值?

switch (type) {
    case INCREASING: 
        if (currentVal >= duration) { done = true; }
        break;
    case DECREASING:
        if (currentVal <= 0) { done = true; }
        break;
    default: 
        done = false;
        break;
    }

done = (type == INCREASING ? currentVal >= duration ? true : false : false) || (type == DECREASING ? currentVal <= 0 ? true : false : false);

public static final int INCREASING = 1;
public static final int DECREASING = -1;
private float currentVal;
private float duration; //is set in the constructur
private boolean done = false;

他们在我想用它实现的目标方面都做了同样的事情。我只是觉得switch语句可能会快一点,因为它不会检查所有内容? 我喜欢将它放在一条线上的优势,但实际上值得考虑的是差异吗?

4 个答案:

答案 0 :(得分:9)

第三种选择:

done = (type == INCREASING && currentVal >= duration) ||
       (type == DECREASING && currentVal <= 0);

我认为它在简洁性和可读性之间是一个很好的折衷方案。正如其他人所提到的那样,速度是无关紧要的(在最坏的情况下,你要进行四次整数比较和三次布尔比较),除非在你将这些代码投入生产之后,你会看到性能问题并能够确定这里存在瓶颈。

答案 1 :(得分:1)

速度应该没有重大差异。 但是,该开关更具可读性和可维护性。

  • 易于阅读和理解
  • 在交换机
  • 中添加新选项会非常容易
  • 切换选项更容易调试。

另见Is the ternary operator faster than an “if” condition

答案 2 :(得分:1)

switch语句通常使用等效的哈希码/等号(至少对于StringEnum)或其他情况的跳转表,以及您的代码:

done = ( type == INCREASING ? 
          currentVal >= duration ? true : false  // A
          : false) // B
    || ( type == DECREASING ? 
          currentVal <= 0 ? true : false  // C
       : false ) // D;

有一个懒惰的评价:

  • type == INCREASING => true,请勿执行D.
  • type == DECREASING => false,请勿执行C.
  • 如果a为真,
  • a || b不执行b
  • a && b如果a为假,则不执行b

你应该这样写:

done = ( (type == INCREASING) ? currentVal >= duration : false) // B
    || ( (type == DECREASING) ? currentVal <= 0 : false ) // D;

然后:

done = (type == INCREASING && currentVal >= duration)
    || (type == DECREASING && currentVal <= 0);

我会坚持switch或简单if / else,如果它比上面的表达式更复杂,而不是使用远远不是三元运算符的叠加可读(我在第一个例子中使用了新行来使其更具可读性)。

答案 3 :(得分:1)

这不是“答案”;但只是一个观点无法适应评论。


我可能会这样写:

if (type == INCREASING && currentVal >= duration) {
    done = true;
} else if (type == DECREASING && currentVal <= 0) {
    done = true;
}

没有其他/ done = false,因为如果清除它就像其他地方的问题一样。 另外,done = true可能会更好地替换为breakreturn等。