|
require "coverage"
|
|
require "benchmark/ips"
|
|
|
|
def make_iseq_of_size goal, code
|
|
builder = ->(r) {
|
|
ruby = <<-eoruby
|
|
x = 1
|
|
#{r.times.map { code }.join "\n" }
|
|
eoruby
|
|
RubyVM::InstructionSequence.compile ruby
|
|
}
|
|
|
|
low = 1
|
|
high = builder.(goal).size
|
|
iseq = nil
|
|
|
|
while low < high
|
|
mid = low + (high - low) / 2
|
|
iseq = builder.(mid)
|
|
if iseq.size < goal
|
|
low = mid + 1
|
|
else iseq.size > goal
|
|
high = mid - 1
|
|
end
|
|
end
|
|
|
|
iseq
|
|
end
|
|
|
|
def make_fast_iseq size
|
|
make_iseq_of_size size, 'x + x'
|
|
end
|
|
|
|
def make_slow_iseq size
|
|
make_iseq_of_size size, 'x = 1'
|
|
end
|
|
|
|
res = Benchmark.ips do |x|
|
|
fast_iseq_100 = make_fast_iseq(100)
|
|
x.report("#{fast_iseq_100.size} fast") { fast_iseq_100.markable_object_count }
|
|
|
|
fast_iseq_1000 = make_fast_iseq(1000)
|
|
x.report("#{fast_iseq_1000.size} fast") { fast_iseq_1000.markable_object_count }
|
|
|
|
fast_iseq_10000 = make_fast_iseq(10000)
|
|
x.report("#{fast_iseq_10000.size} fast") { fast_iseq_10000.markable_object_count }
|
|
|
|
fast_iseq_100000 = make_fast_iseq(100000)
|
|
x.report("#{fast_iseq_100000.size} fast") { fast_iseq_100000.markable_object_count }
|
|
|
|
slow_iseq_100 = make_slow_iseq(100)
|
|
x.report("#{slow_iseq_100.size} slow") { slow_iseq_100.markable_object_count }
|
|
|
|
slow_iseq_1000 = make_slow_iseq(1000)
|
|
x.report("#{slow_iseq_1000.size} slow") { slow_iseq_1000.markable_object_count }
|
|
|
|
slow_iseq_10000 = make_slow_iseq(10000)
|
|
x.report("#{slow_iseq_10000.size} slow") { slow_iseq_10000.markable_object_count }
|
|
|
|
slow_iseq_100000 = make_slow_iseq(100000)
|
|
x.report("#{slow_iseq_100000.size} slow") { slow_iseq_100000.markable_object_count }
|
|
end
|
|
|
|
require 'csv'
|
|
|
|
CSV do |csv|
|
|
csv << ["pointers", "ips"]
|
|
res.entries.each do |entry|
|
|
csv << [entry.label[/^\d+/], entry.ips]
|
|
end
|
|
end
|
|
|
|
__END__
|
|
|
|
[aaron@TC ruby (eliminate-mark-ary)]$ ./ruby -I ~/git/benchmark-ips/lib x.rb
|
|
Warming up --------------------------------------
|
|
107 fast 51.019k i/100ms
|
|
987 fast 6.558k i/100ms
|
|
9987 fast 681.000 i/100ms
|
|
99987 fast 68.000 i/100ms
|
|
98 slow 35.413k i/100ms
|
|
998 slow 3.895k i/100ms
|
|
10004 slow 397.000 i/100ms
|
|
99998 slow 39.000 i/100ms
|
|
Calculating -------------------------------------
|
|
107 fast 592.822k (± 4.3%) i/s - 2.959M in 5.002552s
|
|
987 fast 67.417k (± 3.5%) i/s - 341.016k in 5.064936s
|
|
9987 fast 6.671k (± 5.4%) i/s - 33.369k in 5.020232s
|
|
99987 fast 653.789 (± 8.3%) i/s - 3.264k in 5.032978s
|
|
98 slow 378.918k (±10.4%) i/s - 1.912M in 5.113554s
|
|
998 slow 39.021k (± 5.3%) i/s - 194.750k in 5.007117s
|
|
10004 slow 3.894k (± 5.3%) i/s - 19.850k in 5.112539s
|
|
99998 slow 387.217 (± 6.7%) i/s - 1.950k in 5.065411s
|
|
pointers,ips
|
|
107,592822.1313505468
|
|
987,67416.51114832592
|
|
9987,6671.08318754785
|
|
99987,653.7886910885874
|
|
98,378918.2037573504
|
|
998,39021.06843464474
|
|
10004,3894.3530685987253
|
|
99998,387.21668397168526
|