2013-01-17 49 views
5

我有一個條件來檢查說刪除和文章,如果用戶是所有者。如果條件vs &&,是否有任何性能增益

delete_article if user.owner? 

另一種方式是

user.owner? && delete_article 

是否有選擇要麼它的任何好處或者是它只是一個寫作風格

+10

首先在意圖方面更清晰 – apneadiving

+0

編寫一個基準並自行計算出來。這很容易做到。 –

+0

這樣的性能優勢(如果有的話)對於網絡應用程序來說並不重要(網絡/ IO延遲將使任何收益都相形見絀)。因此,我會以風格爲目標,在這種情況下,我個人更喜歡'if'over'&&'。 – Kris

回答

2

下面是一些代碼來測試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) 
+0

ohh我看到如果更好(雖然可以忽略不計) – Ross

+0

在單行程序中它可以忽略不計,但是,縮放到一個功能齊全的程序,在循環內部執行大量條件時,它可能會累計達到幾分鐘或更長時間。對基準測試的好處是我們可以學習有效的方法來做事,始終如一地執行,並從許多人認爲的「慢」語言中獲得最佳性能。 –

0

我相信這兩種風格寫這將有同樣的表現。始終更喜歡第一個版本,因爲它更容易閱讀,儘管第二個版本被認爲是「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 
+0

使用Ruby內置的[Benchmark](http://www.ruby-doc.org/stdlib-1.9.3/libdoc/benchmark/rdoc/Benchmark.html)。這很容易設置,並提供體面的方式來格式化輸出。 –

6

表現不太可能成爲該聲明的問題。

第一個更好 - 它更容易閱讀。你將來的自己和其他將要開發代碼的人會感謝你。

+0

查看關於速度差異的基準。 –

+0

是的 - 不是問題 –

0

他們應該有同樣的表現,或者至少可以忽略不計的表現。

+0

你錯了。 'true && 1#=> 1' –

+2

只有當第一個不是真的時候,它們纔會返回不同的結果'1 if false#=> nil'和'false && 1#=> false' –

+0

實際上是的,我的壞。這很奇怪 –

3

您可以使用這兩種樣式,但邏輯中存在一些差異。

用在方法調用:如果用戶不是所有者

def something 
    delete_article if user.owner? 
end 

將返回無論方法delete_article退貨或nil

有了:

def something 
    user.owner? && delete_article 
end 

如果用戶不是所有者它會返回false。如果用戶是所有者,它將返回delete_article返回的任何方法。

性能應該差不多。

+0

在任何一種情況下,返回的值都會評估爲「false」,因爲nil和false對於「真實性」是等效的。 –

+0

沒錯,但你必須意識到你期望什麼樣的價值......也許你有像'result.nil?'這樣的東西。如果'false'作爲返回值,它將評估爲'false'。 – spas

0

在性能方面,if是更好,因爲鐵皮人表示。但有時,你需要使用&&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) 

沒有這樣的問題。

相關問題