[WIP] 확장 가능한 작업
5242 단어 benchmark-ips
묘사
Hi@evanphx나는 분배된 대상수나 실행된 조회수 등을 추가하기 위해
benchmark-ips
을 자주 확장하고 싶다는 것을 발견했다.예를 들면https://github.com/michaelherold/benchmark-memory(또 하나, 찾을 수 없다) 하지만 솔직히 말하면 이 기본적으로 흔히 볼 수 있는 코드는 기초가 하나밖에 없으면 좋겠다.나는
benchmark-ips
을 기초 접착제로 유지하고 다양한 유형의 기준 테스트를 실행할 수 있기를 바란다.(당신의 주요 목표가 아닐 수도 있습니다)나는 앞의 두 가지 약속은 모두 생각하지 않은 것이라고 생각한다.
어쩌면 세 번째도
만약 네가 원한다면, 나는 그 중 일부를 단독 관계로 끌어들여서 거기서부터 시작할 수 있다.
토론 #1
이거 대박!그것을 첨가하는 것은 정말 의심의 여지가 없다.혹시 기억나세요? 저희도 발표에 추가할 수 있을까요?토론 #2
@evanphxsweet - 이 길이 정확한지 확인하기 위해 이것들을 함께 놓았습니다.내가 사용한 원시 코드는 원숭이 패치/해커 같다.나는 그것을 이 추상적인 것으로 바꿀 것이다.이것도 그것이 추상과 함께 일할 수 있는지를 시험할 것이다.
뭘 보충할 수 있는지 보자.
그것은
benchmark-memory
만큼 광범위하지는 않지만, 여러 측정에서 예시를 실행할 수 있다. 코드를 읽을 때 @michaelherold가 이 코드를 사용하여 얼마나 훌륭한 작업을 했는지 깨달았다.토론 #셋
감사합니다, @kbrock!나는 나의 프로젝트 명세서에 이미 오랫동안 있었다. (나는 2016년 루비콘프에서 에반과 이 일을 이야기한 적이 있다. 하!)
benchmark-ips
과 benchmark-memory
을 결합한 포장보석을 제작한다.나는 심지어 그것의 이름을 지어주었다: benchmark-time_and_space
!😆내가 해야 할 일은 'hold' 서열화 형식을 줄 기반이 아니라 JSON 기반으로 바꾸는 것이다.
여기서 큰 소리로 생각하자. 나는
benchmark-ips
을 확장성 있게 하는 것을 좋아하고, 또한 benchmark-memory
을 더욱 쉽게 사용할 수 있도록 하기를 좋아한다.토론 #4
홀드의 전체적인 개념을 알고 싶습니다.너는 두 가지 기준 테스트를 실행할 수 있다. (더 많을 수도 있지만...)
일련의 같은 방법으로 이루어진 1 파일e、 g:fast-ruby
B.1 파일에는 다양한 접근 방식이 포함되어 있습니다.e、 g:ruby bench
hold
은 사례 B에 적용되는 것처럼 보이지만 매우 수동적으로 변경됩니다.한 가지 방법을 개선한 후에 두 가지 실현을 실행하는 것이 많은 절차를 증가시킨 것 같다.CI에서 모든 버전을 실행하는 라이브러리가 좋을 수도 있습니다.api (즉: Benchmark.fyi) 만 사용하여 여러 개의 실현에서 실행하는 것이 더 의미가 있습니까?이것이 바로
hold.csv
파일의 본질이다.맞습니까?여러 개의 실행 중인 공공 데이터.파일을 저장하거나 API가 있는 프로세스일 수 있습니다.우리는 메모리, 조회, 시간을 저장하기 위해blob/json의 통계 데이터를 더 많이 필요로 한다.
우리는 이 특정한 테스트 운행을 위한 실현된 메타데이터를 필요로 한다.e, g: 루비 버전, 라이브러리 버전, 시간 운행.
그러나 이 외에도 기준과 매우 비슷하다.단지 참고로 제공하다
하지만 나는 이미 나를 뛰어넘었다고 생각한다.
어쩌면 난 루비벤치를 개조하고 있을지도 몰라.
토론 #5
대기 시스템이 더 좋을 거예요.최초의 설계 목적은 루비가 실행한 변경 사항에 대한 기준 테스트를 돕는 것입니다. 이것은 루비가 저장하고 다시 실행하도록 요구하는 이유입니다.토론 #6
@evanphx 응, 좋은 대화였어.하지만 미안하지만, 나는 이 두 대화를 혼동했다.나는 몇 가지 생각으로 다른 문제나 홍보를 열 것이다.@michaelherold 예시를 정의한 다음 이 두 가지/다른 테스트 유형에 사용하려고 합니다.나는 원래 이것이
Suite
인터페이스를 통해 확장할 수 있다고 생각했다.그러나 Suite
은 테스트 사이에 발생하는 일에 더 관심을 가지고, 이는 단일 테스트에서 발생하는 일에 더 관심을 갖는다는 것을 깨달았다.토론 #7
@evanphx는 아주 잘했어. 사실 이것이 내가 그것을 사용하는 목적이야.😄토론 #8
@evanphxok, 약간의 변화를 추진했습니다.나는 당신이 나에게 이 기능을 확장할 것을 요구해서 매우 기쁩니다. 왜냐하면 나는 실현 과정에서 몇 가지 문제를 발견했기 때문입니다.
run(full_report)
인지 run(job)
인지 불확실합니다.Benchmark::IPS::Objects
을 추가할지 모르겠습니다.보아하니 @michaelherold의 업무가 더욱 철저해진 것 같다.적어도 나는 이 평론이 다른 작가들에게 간단한 예가 되기를 바란다토론 #9
네, 다녀오겠습니다.나는 그것을 기억 보고서에 쓸 것이다. 마이클이 나의 실현을 찢어서 그의 보석처럼 위대하게 하기를 바란다
데이터는
Report::Entry
을 입력해야지 토론 #10
require "benchmark/ips"
require "active_record"
ActiveRecord::Base.establish_connection(ENV.fetch('DATABASE_URL') { "postgres://localhost/user_benchmark" })
ActiveRecord::Migration.verbose = false
ActiveRecord::Schema.define do
create_table :users, force: true do |t|
t.string :name
end
#add_index :users, :name
end
class User < ActiveRecord::Base ;end
if User.count == 0
puts "Creating 100 users"
100.times { |i| User.create name: "user #{i}" }
end
Benchmark.ips do |x|
x.report("User.all.first") { User.all.first }
x.report("User.all.to_a.first") { User.all.to_a.first }
x.compare!
x.queries!
x.objects!
end
을 출력하는 것이 아니라고 생각합니다.Creating 100 users
Warming up --------------------------------------
User.all.first 287.000 i/100ms
User.all.to_a.first 81.000 i/100ms
Calculating -------------------------------------
User.all.first 2.962k (±14.5%) i/s - 14.637k in 5.081636s
User.all.to_a.first 955.136 (± 7.2%) i/s - 4.779k in 5.034635s
Queries:
User.all.first: 1 queries 1 objects
User.all.to_a.first: 1 queries 100 objects
Comparison:
User.all.first: 2962.3 i/s
User.all.to_a.first: 955.1 i/s - 3.10x slower
Queries Comparison:
User.all.to_a.first: 1 queries 100 objects
User.all.first: 1 queries 1 objects
Comparison:
User.all.to_a.first: 1184 objects
User.all.first: 148 objects
토론 #11
제품 상태: 우선 89- 비교 인터페이스 확인(유지/보존 인터페이스도 있을 수 있음)현재 궤도에서는 데이텀 IP에 너무 많은 영향을 미칠 수 있습니다.먼저 보고 인터페이스를 주목하고 거기서부터 시작하세요.
토론 #12
파일을 닫고 버스트를 계속하시겠습니까?토론 #13
네, 그럴게요.감사합니다.Reference
이 문제에 관하여([WIP] 확장 가능한 작업), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://github.com/evanphx/benchmark-ips/issues/88텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)