구성 가능한 샘플링 빈도/기간

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-ipsbootstrap 신뢰 구간을 도입하는 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.

고칠게요.
명시적으로 구성되지 않은 경우timetime 벤치마크sample_duration의 99.9% 사용을 덮어쓸 수 있음)에 대해 길이 경고 없이 이 작업을 자동으로 수행하는 방법은 무엇입니까?
SD 중첩을 복구하려고 두 번 시도했는데, 매번 비결정적인 결과에 대한 경고를 한 줄씩 인쇄한 후에 다시 실험을 실행합니까?기본적으로 최대 2개의 코드 블록이 실행되는 경우 다음과 같이 표시됩니다.
- 기본적으로 10초 정도 소요되며,
- 첫 번째 알림 인쇄, 두 번째 실행은 20초,
- 두 번째 통지가 인쇄되고 세 번째 운행은 40초가 걸리며 이후benchmark-ips에 포기합니다.bench-ips

69가 이 문제를 해결했다!

좋은 웹페이지 즐겨찾기