哪个是更快,单独的条件,还是与elsif结合?

时间:2013-03-27 22:27:50

标签: ruby

在ruby中,伪代码之间有什么区别,如:

if n > 2:
   do something to A
end

if n > 4:
   do something to B
end

if n >25:
   do something to C
end

vs

if n>2 && n <4:
  do something to A
elif n >4 && n < 25:
  do something to A and do something to B
elif n > 25:
  do something to A and B and C
end

正如您所看到的,他们做同样的事情,但如果您有很多if then语句,则更易于阅读和编写。但是,如果多个if块占用更多处理能力,那么以这种方式编写就不值得。

因此我想知道两者之间是否存在差异?概念性答案很好,我不需要对任何事情进行基准测试

4 个答案:

答案 0 :(得分:2)

1 /它们不等同。

第一个陈述相当于

if n>2 && n <= 4:
  do something to A
elif n > 4 && n <= 25:
  do something to A
  do something to B
elif n > 25:
  do something to A
  do something to B
  do something to C
end

如果do something to A返回nilfalse,则您的第二个语句将不会执行do something to B

您忘了处理n = 4n = 25等角落案件。

2 /在99.9%的情况下,您应该选择更易于阅读/理解/调试的版本。除非此代码运行1000000次/秒,否则无关紧要。 正如您所看到的,您已经通过尝试过早地优化它来创建了2个潜在的错误:)

3 /在表演方面,简短的回答是:这取决于你的数据。

答案很长:在大多数情况下,您必须尝试预测n的范围。 您只需计算比较次数:

n < 2:陈述1:3比较 - 陈述2:3比较

2 < n <= 4:陈述1:3比较 - 陈述2:2比较

4 < n <= 25:陈述1:3比较 - 陈述2:4比较

25 < n:陈述1:3比较 - 陈述2:5比较

答案 1 :(得分:1)

没有区别。两个程序都将返回语法错误,并且不会运行。

答案 2 :(得分:0)

假设您无法预测“最常见的路径”(例如,在绝大多数情况下知道n介于2和4之间),我怀疑第二种方法会更有效率;比较的数量将是相似的。

答案 3 :(得分:0)

嗯,第一个选择减少了逻辑错误的可能性。在第二个选择中,如果n == 4n == 25会发生什么?是的,您可以轻松解决这个问题,但您必须认识到这种可能性。

我认为“做某事”伪代码块只是方法调用,所以你不要重复多少文本。这是一个很难回答的问题,因为这两种方法都不涉及嵌套的if-else子句。 if条款在成本差异方面是如此微不足道,我不会考虑这一点,而“做某事”块的重复也是一样的。但是,我可以想象一种更清晰的方式。 A,B和C都可以有一个像A.handle(n),B.handle(n)和C.handle(n)这样的方法,如果n&lt; = 2,第一个什么都不做,第二个什么都不做如果n <= 4,则如果n <= 25,则第三个不做任何事情。