哪个更快,单独的条件,或者与elsif结合



在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

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块占用了更多的处理能力,那么这样写就不值得了。

所以我想知道两者之间是否有区别?概念答案很好,我不需要基准测试任何东西

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%的情况下,你应该选择更容易阅读/理解/调试的版本。除非这段代码每秒运行100万次,否则这无关紧要。正如您所看到的,由于试图过早地优化它,您已经创建了2个潜在的bug:)

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个比较

不,没有区别。

假设你不能预测"最常见的路径"(例如,知道n在绝大多数情况下在2到4之间),我怀疑第二种方法是否更有效;进行比较的次数将是相似的。

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

我假设"做某事"的伪代码块只是方法调用,所以你不重复你的文本太多。这是一个很难回答的问题,因为这两种方法都不涉及嵌套的if-else子句。if子句的成本差异非常小,所以我不会考虑这一点,而"do something"块中的重复也是如此。然而,我可以想象一个更清晰的方式。A、B和C是否都有一个类似A.handle(n)、B.handle(n)和C.handle(n)的方法,其中第一个方法在n <= 2时不执行任何操作,第二个方法在n <= 4时不执行任何操作,第三个方法在n <= 25时不执行任何操作?

相关内容

最新更新