gpt4 book ai didi

Ruby:无目标 'case' ,与 'if' 相比

转载 作者:数据小太阳 更新时间:2023-10-29 06:54:16 24 4
gpt4 key购买 nike

(我已经问过这个问题 at Ruby Forum ,但没有得到任何答案,所以我现在交叉发布)

根据我的理解,下面的代码是等价的Ruby 1.9 及更高版本:

# (1)
case
when x < y
foo
when a > b
bar
else
baz
end

# (2)
if x < y
foo
elsif a > b
bar
else
baz
end

到目前为止,出于习惯,我一直会使用 (2)。有人能想到出于某种特殊原因,为什么 (1) 或 (2) “更好”,或者只是品味问题?

澄清:一些用户反对,这个问题只是“基于意见”,因此不适合这个论坛。因此,我认为我自己说得不够清楚:我不想开始讨论个人编程风格。我提出这个话题的原因是:

令我惊讶的是,Ruby 提供了两种截然不同的语法(target-less case 和 if-elsif),在我看来,它们的目的完全相同,特别是因为 if-elsif 语法实际上是一种语法每个程序员都很熟悉。我什至不会将“无目标 if”视为“语法糖”,因为它不允许我比“if-elsif”更一致地表达编程逻辑。

所以我想知道在什么情况下我可能想要使用“无目标案例”结构。它是否具有性能优势?它与 if-elsif 是否有一些我没有注意到的细微差别?

关于无目标案例实现的其他发现:

Olivier Poulin 指出,无目标的 case 语句会显式使用 === 运算符来对付值“true”,这会导致“case”与“if”相比的(微小)性能损失(还有一个我不明白为什么有人可能想要使用它的原因)。

但是,在查看 Ruby 1.9 和 Ruby 2.0 的 case 语句的文档时,我发现它们的描述不同,但两者至少都表明 === 可能不会在这种情况下使用。在Ruby 1.9的情况下:

Case statements consist of an optional condition, which is in the position of an argument to case, and zero or more when clauses. The first when clause to match the condition (or to evaluate to Boolean truth, if the condition is null) “wins”

这里说,如果条件(即“case”之后的条件)为空(即不存在),则第一个评估为真的“when”子句将被执行。此处未提及 ===。

Ruby 2.0 ,措辞完全不同:

The case expression can be used in two ways. The most common way is to compare an object against multiple patterns. The patterns are matched using the +===+ method [.....]. The other way to use a case expression is like an if-elsif expression: [example of target-less case is given here].

因此它说 === 以“第一种”方式使用(带有目标的情况),而无目标情况“类似于”if-elsif。这里没有提到===。

最佳答案

Midwire ran a few benchmarks and concluded that if/elsif is faster than case because case “implicitly compares using the more expensive === operator”.

Here是我得到这句话的地方。它将 if/elsif 语句与 case 进行比较。

它非常详尽,探索了指令序列中的差异,肯定会让您了解哪个更好。

不过,我从帖子中提取的主要内容是 if/else if 和 case 没有巨大差异,两者通常可以互换使用。

根据您的案例数量,可能会出现一些主要差异。

n = 1 (last clause matches)
if: 7.4821e-07
threequal_if: 1.6830500000000001e-06
case: 3.9176999999999997e-07

n = 15 (first clause matches)
if: 3.7357000000000003e-07
threequal_if: 5.0263e-07
case: 4.3348e-07

如您所见,如果匹配到最后一个子句,if/elsif 的运行速度比 case 慢很多,而 if 匹配第一个子句,反之亦然。

这种区别是因为if/elsif使用了branchunless,而case使用了 branchif 在它们的指令序列中。


这是我自己用无目标 caseif/elsif 语句(使用“==” ).第一次是case,第二次是if/elsif

第一个测试,5 个when 语句,5 个if/elsif,第一个子句对两者都为真。

Time elapsed 0.052023 milliseconds                                                                                                                                                                                                                                                                                                                                                                                                       
Time elapsed 0.031467999999999996 milliseconds

第二个测试,5 个 when 语句,5 个 if/elsif,最后一个(第 5 个)子句对两者都为真。

Time elapsed 0.001224 milliseconds                                                                                                                                                                                                                                                                                                                                                                                                 
Time elapsed 0.028578 milliseconds

如您所见,正如我们之前所见,当第一个子句为真时,if/elsif 的性能优于 case,而当最后一个子句为真时,case 具有巨大的性能优势。

结论

运行更多测试表明它可能归结为概率。如果您认为答案会在您的子句列表中更早出现,请使用 if/elsif,否则 case 似乎更快。

这表明的主要事情是 caseif/elsif 都同样有效,并且使用其中一个比另一个更重要取决于概率和品味。

关于Ruby:无目标 'case' ,与 'if' 相比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31142804/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com