2017-03-17 8 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'があなたの例と関係がない場合、呼び出しを削除して2つの配列を作成することができます。しかし、このレベルの最適化は役に立たない可能性があります。私は理解しやすいコードを使っています。 – Stefan

答えて

2

Benchmarkを使用して簡単にテストできます。

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$ 

もたらす

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 

ので秒より速くなるであろう。おそらくこれを引き起こしているa + b + cx + y + zの繰り返し計算です。

+0

興味深い...どうもありがとうございました。私はこの「ベンチマーク」技術をあまり使わなかった。私はそれをもっと調べなければならないだろう。ありがとう! – jkessluk

+1

私はちょうどRubyがPythonの 'timeit'に似たものを持っていると考えました。どういたしまして! – PidgeyUsedGust

関連する問題