2017-03-17 4 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을 사용하면 쉽게 테스트 할 수 있습니다.

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

나는 루비가 파이썬의'timeit'과 비슷한 것을 가지고있을 것이라고 생각했다. 천만에요! – PidgeyUsedGust