구성 가능한 샘플링 빈도/기간
5570 단어 benchmark-ips
나는 내가 그것을 합병할 수 있을지 모르겠지만, 적어도 한번 시도해 보자. (나는 여러 가지 건의를 받아들이고, 필요에 따라 공관을 수정할 것이다.)
거래는 다음과 같다:
묘사
정확한 루비 기준 테스트에 매우 유익하지만, 나는 일부 상황에서 사용자가 잘못된 길로 들어서게 할 수 있다고 생각한다.즉, SD를 측정하고 보고하기 때문에 신(#60)은 신뢰할 수 없는 통계적 증거에 따라 기준을 정하는 것을 정확하게 거부하기 때문에 일부 개발자들은 기준에 의해 테스트된 코드의 두 버전이 성능상 같고 사실상 잘못된 것으로 잘못 결론을 내렸다.기준은 판정할 수 없는 것이 아니라, 그것들의 배치benchmark-ips
가 그것들이 정확한 결과를 얻는 것을 막았을 뿐이다.내 경험(이긴 주관적인 일화 증거: Innomy:)에 따르면 기준 지속 시간에 대한 엄격한 시간 제한 없이 시끄러운 기준을 길들이고 결정할 수 있다.기준 테스트를 할 때 차이를 무시하는 것은 당연히 어리석은 일이지만, 때때로 일부 소음은 받아들일 수 있다. 우리는 어느 버전의 코드가 더 빠른지 알고 싶다. (통상적으로 두 버전 모두 비교할 수 있는 SD가 있기 때문에 지연/SD를 무시하는 상황에서 평균치를 추구하는 것이 아니다.)
이 PR에서 샘플링 지속 시간/간격(또는 샘플링 빈도)을 구성 가능한 것으로 설정하는 것이 좋습니다. 또한 통계 결과가 명확하지 않으면
benchmark-ips
이제 구성을 조정하고 실험을 더 긴 지속 시간과 더 낮은 샘플링 빈도로 다시 실행하는 것이 좋습니다.홍보는 @Chriseaton의 홍보 60의 정신적 계승자입니다. 당신들의 생각을 알게 해 주세요.
MRI:
# bench.rb
require 'benchmark/ips'
# I like to make my VMs work instead of sleeping ;)
def work(num)
nnum = num * 300 # magic const to make the example work
i = 0
while i < nnum
i+=1
end
i
end
Benchmark.ips do |x|
x.report("work(1000 + r(500))") do
work(1000 + rand(500))
end
x.report("work(1000 + r(400))") do
work(1000 + rand(400))
end
x.compare!
end
> ruby -Ilib bench.rb ⏎
Warming up --------------------------------------
work(1000 + r(500)) 15.000 i/100ms
work(1000 + r(400)) 15.000 i/100ms
Calculating -------------------------------------
work(1000 + r(500)) 155.226 (± 2.6%) i/s - 780.000 in 5.029015s
work(1000 + r(400)) 162.102 (± 3.1%) i/s - 810.000 in 5.000809s
Comparison:
work(1000 + r(400)): 162.1 i/s
work(1000 + r(500)): 155.2 i/s - same-ish: difference falls within error
-------------------------------------------------------------------------
Some reports were within standard deviation of each other. Because of that
benchmark-ips was unable to decide which of them is faster. It is quite
possible that with a slightly tweaked configuration benchmark-ips will
be able to provide more accurate results.
Please try re-running your benchmark with the following additional
configuration:
Benchmark.ips do |x|
x.sample_duration = 0.4 # <--- new config
x.time = 10 # <--- new config
# ...
Please note that running the benchmark with the new configuration
will take longer and might not result in a more accurate measurement.
In that case benchmark-ips will re-print this warning with an even
more aggressive configuration option suggestions. It is a good idea
to try to follow benchmark-ips's advice a couple of times (each time
re-running the benchmark with new options), letting it escalate
its configuration repeatedly (a good rule is to give up after 3-4
iterations).
제안된 변경 사항 구현:# bench.rb
require 'benchmark/ips'
# I like to make my VMs work instead of sleeping ;)
def work(num)
nnum = num * 300 # magic const to make the example work
i = 0
while i < nnum
i+=1
end
i
end
Benchmark.ips do |x|
x.sample_duration = 0.4
x.time = 10
x.report("work(1000 + r(500))") do
work(1000 + rand(500))
end
x.report("work(1000 + r(400))") do
work(1000 + rand(400))
end
x.compare!
end
> ruby -Ilib bench.rb ⏎
Warming up --------------------------------------
work(1000 + r(500)) 61.000 i/100ms
work(1000 + r(400)) 64.000 i/100ms
Calculating -------------------------------------
work(1000 + r(500)) 154.372 (± 1.3%) i/s - 1.586k in 10.276211s
work(1000 + r(400)) 161.165 (± 1.2%) i/s - 1.664k in 10.326133s
Comparison:
work(1000 + r(400)): 161.2 i/s
work(1000 + r(500)): 154.4 i/s - 1.04x slower
✨ 🎉 benchmark-ips
bootstrap 신뢰 구간을 도입하는 PR이 있는데 이 과정이 진행 중입니다.실천에서 그것들은 SD보다 훨씬 작고 수학적으로도 더욱 엄격하고 조작이 가능하다고 말할 수 있다.그들은 우리에게 95% 신뢰도로 1.5배 빠르다 (±0.1) 는 결과를 줄 것이다.
그것은 이 PR에 서로 다른 기능을 도입했기 때문에 충돌은 없지만, 같은 문제를 해결할 수도 있다. 시간 간격이 겹칠 가능성은 훨씬 적다.
토론 #1
나는 그것이 어떻게 일을 하는지 폭로하는 것에 개의치 않는다. 그러나:-
토론 #2
의 단위는 얼마입니까?-
sample_duration
의 단위는 얼마입니까?- 이것은
time
의 공공 API를 파괴했다. 우리는 이렇게 해서는 안 될 수도 있다.Benchmark.compare
- What is the unit of
sample_duration
?- What is the unit of
time
?
토론 #셋
의 단위는 초(기존 옵션으로 이 PR과 무관함)이고 time
의 단위는 초이다.조금 다르다. sample_duration
원한다고 했지만, afaik는 부동을 잘 사용할 수 있고, time
원한다고 했다. Integer
나는 밀리초로sample_duration
표시하거나 헤르츠로Float
표시하는 것을 고려해 보았지만 마지막에 초로sample_duration
와 일치하기 위해서) 표시하기로 결정했다.
- This breaks the public API of
Benchmark.compare
, which we probably should not do.
고칠게요.
명시적으로 구성되지 않은 경우
time
및 time
벤치마크sample_duration
의 99.9% 사용을 덮어쓸 수 있음)에 대해 길이 경고 없이 이 작업을 자동으로 수행하는 방법은 무엇입니까?SD 중첩을 복구하려고 두 번 시도했는데, 매번 비결정적인 결과에 대한 경고를 한 줄씩 인쇄한 후에 다시 실험을 실행합니까?기본적으로 최대 2개의 코드 블록이 실행되는 경우 다음과 같이 표시됩니다.
- 기본적으로 10초 정도 소요되며,
- 첫 번째 알림 인쇄, 두 번째 실행은 20초,
- 두 번째 통지가 인쇄되고 세 번째 운행은 40초가 걸리며 이후
benchmark-ips
에 포기합니다.bench-ips
69가 이 문제를 해결했다!
Reference
이 문제에 관하여(구성 가능한 샘플링 빈도/기간), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://github.com/evanphx/benchmark-ips/issues/68
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(구성 가능한 샘플링 빈도/기간), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://github.com/evanphx/benchmark-ips/issues/68텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)