2013-03-27 81 views
1

在Ruby中,有没有像伪代码之间的区别:哪个更快,单独的条件或与elsif结合?

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块正在占用更多处理能力,那么以这种方式编写它就不值得。

因此,我想知道两者之间是否有区别?概念上的答案是好的,我不需要任何基准测试

+0

我试图重写你的标题有点希望阻止这个问题被关闭。我删除了句子片段,并试图让它听起来更一般。 – 2013-03-28 03:40:37

回答

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的范围。 你可以只算比较次数:3个比较 - 2声明:

n < 2:1声明3比较

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

4 < n <= 25:声明1:3周的比较 - 声明2:4比较

25 < n:声明1:3周的比较 - 声明2:5比较

+0

我犯了很多错误,因为我很快写出来,只是大声想着,但你肯定清除了我的一些问题。 TY。 – 2013-03-28 01:17:38

0

假设你不能预测“最常见的路径”(例如,知道n绝大多数时间在2和4之间),我会怀疑第二种方法会更有效率;所做的比较次数也是相似的。

0

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

我假设“做某事”伪代码块只是方法调用,所以你不会重复你的文本太多。这是一个很难回答的问题,因为这两种方法都不涉及嵌套的if-else子句。 if条款在成本差异上如此微不足道,以致于我不会考虑这一点,而“做某件事”块的重复也是一样。然而,我可以想象一个更清晰的方式。 A,B和C都可以有一个像A.handle(n),B.handle(n)和C.handle(n)这样的方法,其中第一个不做任何事情,如果第二个没有做任何事,如果第二个做不到, n < = 4,如果n < = 25,第三个不做任何事情?

1

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

+1

但是哪个会先找到语法错​​误!? :-) – 2013-03-28 05:15:14