我有一個條件來檢查說刪除和文章,如果用戶是所有者。如果條件vs &&,是否有任何性能增益
delete_article if user.owner?
另一種方式是
user.owner? && delete_article
是否有選擇要麼它的任何好處或者是它只是一個寫作風格
我有一個條件來檢查說刪除和文章,如果用戶是所有者。如果條件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)
ohh我看到如果更好(雖然可以忽略不計) – Ross
在單行程序中它可以忽略不計,但是,縮放到一個功能齊全的程序,在循環內部執行大量條件時,它可能會累計達到幾分鐘或更長時間。對基準測試的好處是我們可以學習有效的方法來做事,始終如一地執行,並從許多人認爲的「慢」語言中獲得最佳性能。 –
我相信這兩種風格寫這將有同樣的表現。始終更喜歡第一個版本,因爲它更容易閱讀,儘管第二個版本被認爲是「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
使用Ruby內置的[Benchmark](http://www.ruby-doc.org/stdlib-1.9.3/libdoc/benchmark/rdoc/Benchmark.html)。這很容易設置,並提供體面的方式來格式化輸出。 –
表現不太可能成爲該聲明的問題。
第一個更好 - 它更容易閱讀。你將來的自己和其他將要開發代碼的人會感謝你。
查看關於速度差異的基準。 –
是的 - 不是問題 –
他們應該有同樣的表現,或者至少可以忽略不計的表現。
你錯了。 'true && 1#=> 1' –
只有當第一個不是真的時候,它們纔會返回不同的結果'1 if false#=> nil'和'false && 1#=> false' –
實際上是的,我的壞。這很奇怪 –
您可以使用這兩種樣式,但邏輯中存在一些差異。
用在方法調用:如果用戶不是所有者
def something
delete_article if user.owner?
end
將返回無論方法delete_article退貨或nil
。
有了:
def something
user.owner? && delete_article
end
如果用戶不是所有者它會返回false
。如果用戶是所有者,它將返回delete_article返回的任何方法。
性能應該差不多。
在任何一種情況下,返回的值都會評估爲「false」,因爲nil和false對於「真實性」是等效的。 –
沒錯,但你必須意識到你期望什麼樣的價值......也許你有像'result.nil?'這樣的東西。如果'false'作爲返回值,它將評估爲'false'。 – spas
在性能方面,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)
沒有這樣的問題。
首先在意圖方面更清晰 – apneadiving
編寫一個基準並自行計算出來。這很容易做到。 –
這樣的性能優勢(如果有的話)對於網絡應用程序來說並不重要(網絡/ IO延遲將使任何收益都相形見絀)。因此,我會以風格爲目標,在這種情況下,我個人更喜歡'if'over'&&'。 – Kris