2017-03-17 55 views
0

我正在優化一些代碼。我需要a+b+cx+y+z的總和,並且我將計算這些變量的最小值和最大值。使用minmax不是一種選擇。我會分開做這些計算。哪個更快:計算或分配

以下哪個代碼塊更快?

min, max = 0, 0 
max = [max, a + b + c, x + y + z].max 
min = [min, a + b + c, x + y + z].min 

或者我可以做這樣的事情:

min, max = 0, 0 
sum, sum2 = a + b + c, x + y + z 

max = [max, sum, sum2].max 
min = [min, sum, sum2].min 

是賦值,然後不僅僅是計算它們,因爲我需要他們更快調用這些變量?如果我以後在同一個範圍內需要這些總和,則爲了便於閱讀而分配變量會更清晰。

我只是對Ruby的內部工作感到好奇,不僅僅是我的開發過程。

+0

_「使用minmax不是選項」_ - 爲什麼不? – Stefan

+0

我主要問這個問題,以確定什麼是更快的紅寶石,任務或計算,以及爲什麼。不計算實際的最小值或最大值。 – jkessluk

+1

如果'min'和'max'與您的示例無關,您可以刪除這些調用並創建兩個數組。但是,這種優化級別可能無用。我會選擇更容易理解的代碼。 – Stefan

回答

2

您可以使用Benchmark輕鬆地進行測試。

require 'benchmark' 

a, b, c, x, y, z = [1,3,5,7,9,11] 

n = 1000000 
Benchmark.bm do |bench| 
    bench.report("1") { 
    n.times do 
     min, max = 0, 0; 
     max = [max, a + b + c, x + y + z].max; 
     min = [min, a + b + c, x + y + z].min; 
    end 
    } 
    bench.report("2") { 
    n.times do 
     min, max = 0, 0; 
     sum, sum2 = a + b + c, x + y + z; 
     max = [max, sum, sum2].max; 
     min = [min, sum, sum2].min; 
    end 
    } 
end 

這導致

bash-3.2$ ruby rubyspeed.rb 
     user  system  total  real 
1 0.160000 0.000000 0.160000 ( 0.154085) 
2 0.120000 0.000000 0.120000 ( 0.119762) 
bash-3.2$ 

所以第二將會更快。這可能是重複計算a + b + cx + y + z造成的。

+0

有趣...非常感謝你。我沒有使用這種「基準」技術。我將不得不更多地研究它。謝謝! – jkessluk

+1

我剛纔認爲Ruby可能會有類似於Python的'timeit'的東西,它就是這樣。別客氣! – PidgeyUsedGust