如果条件vs &&,是否有任何性能提升

如果用户是所有者,我有条件检查说删除和文章。

delete_article if user.owner? 

另一种方式是

 user.owner? && delete_article 

选择其中任何一个或者只是一种写作风格有什么好处

这里有一些代码来测试if&&的速度。

 require 'benchmark' n = 10_000_000 puts RUBY_VERSION, n puts Benchmark.bm(2) do |b| 10.times do b.report('if') { n.times { true if true } } b.report('&&') { n.times { true && true } } end end 

并输出:

 1.9.3 10000000 user system total real if 0.970000 0.000000 0.970000 ( 0.975714) && 1.130000 0.000000 1.130000 ( 1.127514) if 0.950000 0.000000 0.950000 ( 0.956892) && 1.120000 0.000000 1.120000 ( 1.124547) if 0.970000 0.000000 0.970000 ( 0.962618) && 1.120000 0.000000 1.120000 ( 1.129094) if 0.960000 0.000000 0.960000 ( 0.954498) && 1.120000 0.000000 1.120000 ( 1.125080) if 0.960000 0.000000 0.960000 ( 0.954001) && 1.120000 0.000000 1.120000 ( 1.126329) if 0.950000 0.000000 0.950000 ( 0.953360) && 1.130000 0.000000 1.130000 ( 1.122664) if 0.950000 0.000000 0.950000 ( 0.951391) && 1.120000 0.010000 1.130000 ( 1.123455) if 0.980000 0.000000 0.980000 ( 0.977263) && 1.120000 0.000000 1.120000 ( 1.126989) if 0.970000 0.000000 0.970000 ( 0.966264) && 1.120000 0.000000 1.120000 ( 1.123184) if 0.960000 0.000000 0.960000 ( 0.956702) && 1.120000 0.000000 1.120000 ( 1.124589) 

性能不太可能成为该声明的问题。

第一个更好 – 它更容易阅读。 你未来的自己以及其他能够使用代码的人都会感谢你。

您可以使用这两种样式,但逻辑上存在一些差异。

用于方法调用:

 def something delete_article if user.owner? end 

将返回delete_article返回的方法,如果用户不是所有者,则返回nil

附:

 def something user.owner? && delete_article end 

如果用户不是所有者,它将返回false 。 如果用户是所有者,它将返回delete_article返回的方法。

表现应该大致相同。

我相信这两种写作风格都会有相同的表现。 总是喜欢第一个版本,因为它更容易阅读,虽然被认为是“hacky”和“hard-core”,但第二个版本实际上并没有优化。

编辑:这是如何做一些基准测试。 似乎两个版本的表现确实相似:

 limit = 10**7 time_val=Time.now;sum=0;(0..limit).each{|t| even?(t) && sum += t};puts Time.now - time_val time_val=Time.now;sum=0;(0..limit).each{|t| sum += t if even?(t)};puts Time.now - time_val 

它们应该具有与执行相同操作相同的性能,或者至少可以忽略不同的性能差异。

就性能而言, if更好,就像Tin Man所展示的那样。 但有时,您需要使用&&或者编写and如果您想使其成为单行,例如主要部分包含要在条件中定义的非实例变量的情况:

 do_something_with(foo) if foo = something_that_comes_from_condition 

会返回错误,但是

 (foo = something_that_comes_from_condition) && do_something_with(foo) 

要么

 foo = something_that_comes_from_condition and do_something_with(foo) 

没有这样的问题。