We can make this file beautiful and searchable if this error is corrected: Illegal quoting in line 2.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
2017-11-14 16:00:25 +0900 | |
target 0: ruby_2_4 (ruby 2.4.3p202 (2017-11-03 revision 60626) [x86_64-linux]) at "~/ruby/install/ruby_2_4/bin/ruby" | |
target 1: trunk_oct (ruby 2.5.0dev (2017-09-30 trunk 60079) [x86_64-linux]) at "~/ruby/install/trunk_r60079/bin/ruby" | |
target 2: trunk (ruby 2.5.0dev (2017-11-14 trunk 60762) [x86_64-linux]) at "~/ruby/install/trunk/bin/ruby" | |
target 3: modified (ruby 2.5.0dev (2017-11-14 remove_trace 60762) [x86_64-linux] | |
last_commit=fix trace-on process) at "~/ruby/install/gitruby/bin/ruby" | |
measure target: real | |
----------------------------------------------------------- | |
app_answer | |
def ack(m, n) | |
if m == 0 then | |
n + 1 | |
elsif n == 0 then | |
ack(m - 1, 1) | |
else | |
ack(m - 1, ack(m, n - 1)) | |
end | |
end | |
def the_answer_to_life_the_universe_and_everything | |
(ack(3,7).to_s.split(//).inject(0){|s,x| s+x.to_i}.to_s + "2" ).to_i | |
end | |
answer = the_answer_to_life_the_universe_and_everything | |
ruby_2_4 0.04487689025700092 | |
ruby_2_4 0.044887082651257515 | |
ruby_2_4 0.04478233680129051 | |
ruby_2_4 0.044680457562208176 | |
ruby_2_4 0.044472331181168556 | |
trunk_oct 0.05369561351835728 | |
trunk_oct 0.05327794328331947 | |
trunk_oct 0.053324973210692406 | |
trunk_oct 0.0533294128254056 | |
trunk_oct 0.05318734794855118 | |
trunk 0.05527955200523138 | |
trunk 0.05591896828263998 | |
trunk 0.055002798326313496 | |
trunk 0.055259526707232 | |
trunk 0.05526765063405037 | |
modified 0.05576000455766916 | |
modified 0.056411576457321644 | |
modified 0.05564382392913103 | |
modified 0.05569745972752571 | |
modified 0.055554790422320366 | |
----------------------------------------------------------- | |
app_aobench | |
# AO render benchmark | |
# Original program (C) Syoyo Fujita in Javascript (and other languages) | |
# https://code.google.com/p/aobench/ | |
# Ruby(yarv2llvm) version by Hideki Miura | |
# | |
IMAGE_WIDTH = 256 | |
IMAGE_HEIGHT = 256 | |
NSUBSAMPLES = 2 | |
NAO_SAMPLES = 8 | |
class Vec | |
def initialize(x, y, z) | |
@x = x | |
@y = y | |
@z = z | |
end | |
attr_accessor :x, :y, :z | |
def vadd(b) | |
Vec.new(@x + b.x, @y + b.y, @z + b.z) | |
end | |
def vsub(b) | |
Vec.new(@x - b.x, @y - b.y, @z - b.z) | |
end | |
def vcross(b) | |
Vec.new(@y * b.z - @z * b.y, | |
@z * b.x - @x * b.z, | |
@x * b.y - @y * b.x) | |
end | |
def vdot(b) | |
@x * b.x + @y * b.y + @z * b.z | |
end | |
def vlength | |
Math.sqrt(@x * @x + @y * @y + @z * @z) | |
end | |
def vnormalize | |
len = vlength | |
v = Vec.new(@x, @y, @z) | |
if len > 1.0e-17 then | |
v.x = v.x / len | |
v.y = v.y / len | |
v.z = v.z / len | |
end | |
v | |
end | |
end | |
class Sphere | |
def initialize(center, radius) | |
@center = center | |
@radius = radius | |
end | |
attr_reader :center, :radius | |
def intersect(ray, isect) | |
rs = ray.org.vsub(@center) | |
b = rs.vdot(ray.dir) | |
c = rs.vdot(rs) - (@radius * @radius) | |
d = b * b - c | |
if d > 0.0 then | |
t = - b - Math.sqrt(d) | |
if t > 0.0 and t < isect.t then | |
isect.t = t | |
isect.hit = true | |
isect.pl = Vec.new(ray.org.x + ray.dir.x * t, | |
ray.org.y + ray.dir.y * t, | |
ray.org.z + ray.dir.z * t) | |
n = isect.pl.vsub(@center) | |
isect.n = n.vnormalize | |
else | |
0.0 | |
end | |
end | |
nil | |
end | |
end | |
class Plane | |
def initialize(p, n) | |
@p = p | |
@n = n | |
end | |
def intersect(ray, isect) | |
d = -@p.vdot(@n) | |
v = ray.dir.vdot(@n) | |
v0 = v | |
if v < 0.0 then | |
v0 = -v | |
end | |
if v0 < 1.0e-17 then | |
return | |
end | |
t = -(ray.org.vdot(@n) + d) / v | |
if t > 0.0 and t < isect.t then | |
isect.hit = true | |
isect.t = t | |
isect.n = @n | |
isect.pl = Vec.new(ray.org.x + t * ray.dir.x, | |
ray.org.y + t * ray.dir.y, | |
ray.org.z + t * ray.dir.z) | |
end | |
nil | |
end | |
end | |
class Ray | |
def initialize(org, dir) | |
@org = org | |
@dir = dir | |
end | |
attr_accessor :org, :dir | |
end | |
class Isect | |
def initialize | |
@t = 10000000.0 | |
@hit = false | |
@pl = Vec.new(0.0, 0.0, 0.0) | |
@n = Vec.new(0.0, 0.0, 0.0) | |
end | |
attr_accessor :t, :hit, :pl, :n | |
end | |
def clamp(f) | |
i = f * 255.5 | |
if i > 255.0 then | |
i = 255.0 | |
end | |
if i < 0.0 then | |
i = 0.0 | |
end | |
i.to_i | |
end | |
def otherBasis(basis, n) | |
basis[2] = Vec.new(n.x, n.y, n.z) | |
basis[1] = Vec.new(0.0, 0.0, 0.0) | |
if n.x < 0.6 and n.x > -0.6 then | |
basis[1].x = 1.0 | |
elsif n.y < 0.6 and n.y > -0.6 then | |
basis[1].y = 1.0 | |
elsif n.z < 0.6 and n.z > -0.6 then | |
basis[1].z = 1.0 | |
else | |
basis[1].x = 1.0 | |
end | |
basis[0] = basis[1].vcross(basis[2]) | |
basis[0] = basis[0].vnormalize | |
basis[1] = basis[2].vcross(basis[0]) | |
basis[1] = basis[1].vnormalize | |
end | |
class Scene | |
def initialize | |
@spheres = Array.new | |
@spheres[0] = Sphere.new(Vec.new(-2.0, 0.0, -3.5), 0.5) | |
@spheres[1] = Sphere.new(Vec.new(-0.5, 0.0, -3.0), 0.5) | |
@spheres[2] = Sphere.new(Vec.new(1.0, 0.0, -2.2), 0.5) | |
@plane = Plane.new(Vec.new(0.0, -0.5, 0.0), Vec.new(0.0, 1.0, 0.0)) | |
end | |
def ambient_occlusion(isect) | |
basis = Array.new | |
otherBasis(basis, isect.n) | |
ntheta = NAO_SAMPLES | |
nphi = NAO_SAMPLES | |
eps = 0.0001 | |
occlusion = 0.0 | |
p0 = Vec.new(isect.pl.x + eps * isect.n.x, | |
isect.pl.y + eps * isect.n.y, | |
isect.pl.z + eps * isect.n.z) | |
nphi.times do |j| | |
ntheta.times do |i| | |
r = rand | |
phi = 2.0 * 3.14159265 * rand | |
x = Math.cos(phi) * Math.sqrt(1.0 - r) | |
y = Math.sin(phi) * Math.sqrt(1.0 - r) | |
z = Math.sqrt(r) | |
rx = x * basis[0].x + y * basis[1].x + z * basis[2].x | |
ry = x * basis[0].y + y * basis[1].y + z * basis[2].y | |
rz = x * basis[0].z + y * basis[1].z + z * basis[2].z | |
raydir = Vec.new(rx, ry, rz) | |
ray = Ray.new(p0, raydir) | |
occisect = Isect.new | |
@spheres[0].intersect(ray, occisect) | |
@spheres[1].intersect(ray, occisect) | |
@spheres[2].intersect(ray, occisect) | |
@plane.intersect(ray, occisect) | |
if occisect.hit then | |
occlusion = occlusion + 1.0 | |
else | |
0.0 | |
end | |
end | |
end | |
occlusion = (ntheta.to_f * nphi.to_f - occlusion) / (ntheta.to_f * nphi.to_f) | |
Vec.new(occlusion, occlusion, occlusion) | |
end | |
def render(w, h, nsubsamples) | |
cnt = 0 | |
nsf = nsubsamples.to_f | |
h.times do |y| | |
w.times do |x| | |
rad = Vec.new(0.0, 0.0, 0.0) | |
# Subsampling | |
nsubsamples.times do |v| | |
nsubsamples.times do |u| | |
cnt = cnt + 1 | |
wf = w.to_f | |
hf = h.to_f | |
xf = x.to_f | |
yf = y.to_f | |
uf = u.to_f | |
vf = v.to_f | |
px = (xf + (uf / nsf) - (wf / 2.0)) / (wf / 2.0) | |
py = -(yf + (vf / nsf) - (hf / 2.0)) / (hf / 2.0) | |
eye = Vec.new(px, py, -1.0).vnormalize | |
ray = Ray.new(Vec.new(0.0, 0.0, 0.0), eye) | |
isect = Isect.new | |
@spheres[0].intersect(ray, isect) | |
@spheres[1].intersect(ray, isect) | |
@spheres[2].intersect(ray, isect) | |
@plane.intersect(ray, isect) | |
if isect.hit then | |
col = ambient_occlusion(isect) | |
rad.x = rad.x + col.x | |
rad.y = rad.y + col.y | |
rad.z = rad.z + col.z | |
end | |
end | |
end | |
r = rad.x / (nsf * nsf) | |
g = rad.y / (nsf * nsf) | |
b = rad.z / (nsf * nsf) | |
printf("%c", clamp(r)) | |
printf("%c", clamp(g)) | |
printf("%c", clamp(b)) | |
end | |
nil | |
end | |
nil | |
end | |
end | |
alias printf_orig printf | |
def printf *args | |
end | |
# File.open("ao.ppm", "w") do |fp| | |
printf("P6\n") | |
printf("%d %d\n", IMAGE_WIDTH, IMAGE_HEIGHT) | |
printf("255\n", IMAGE_WIDTH, IMAGE_HEIGHT) | |
Scene.new.render(IMAGE_WIDTH, IMAGE_HEIGHT, NSUBSAMPLES) | |
# end | |
undef printf | |
alias printf printf_orig | |
ruby_2_4 36.20966003648937 | |
ruby_2_4 36.276483993045986 | |
ruby_2_4 36.06006149761379 | |
ruby_2_4 36.40027827769518 | |
ruby_2_4 36.59175945352763 | |
trunk_oct 43.17953597661108 | |
trunk_oct 39.5161963775754 | |
trunk_oct 40.67096074577421 | |
trunk_oct 38.93619007524103 | |
trunk_oct 38.87406879570335 | |
trunk 38.30207220930606 | |
trunk 38.3029449256137 | |
trunk 39.2404085919261 | |
trunk 39.17272327654064 | |
trunk 38.36024654470384 | |
modified 37.33606534730643 | |
modified 37.78875325806439 | |
modified 37.444791925139725 | |
modified 37.156153441406786 | |
modified 38.43332130461931 | |
----------------------------------------------------------- | |
app_erb | |
# | |
# Create many HTML strings with ERB. | |
# | |
require 'erb' | |
data = DATA.read | |
max = 15_000 | |
title = "hello world!" | |
content = "hello world!\n" * 10 | |
max.times{ | |
ERB.new(data).result(binding) | |
} | |
__END__ | |
<html> | |
<head> <%= title %> </head> | |
<body> | |
<h1> <%= title %> </h1> | |
<p> | |
<%= content %> | |
</p> | |
</body> | |
</html> | |
ruby_2_4 1.0910273203626275 | |
ruby_2_4 1.1160900527611375 | |
ruby_2_4 1.1138797011226416 | |
ruby_2_4 1.1137238182127476 | |
ruby_2_4 1.0859335204586387 | |
trunk_oct 0.8029095465317369 | |
trunk_oct 0.8081927429884672 | |
trunk_oct 0.8069239566102624 | |
trunk_oct 0.8096117489039898 | |
trunk_oct 0.8034359868615866 | |
trunk 0.8403531908988953 | |
trunk 0.8421134259551764 | |
trunk 0.8327486971393228 | |
trunk 0.8372374074533582 | |
trunk 0.8351303180679679 | |
modified 0.8252536691725254 | |
modified 0.831566384062171 | |
modified 0.8288772627711296 | |
modified 0.8264654008671641 | |
modified 0.8336413651704788 | |
----------------------------------------------------------- | |
app_factorial | |
def fact(n) | |
if(n > 1) | |
n * fact(n-1) | |
else | |
1 | |
end | |
end | |
100.times { | |
fact(5000) | |
} | |
ruby_2_4 0.603745648637414 | |
ruby_2_4 0.6038031615316868 | |
ruby_2_4 0.6046772794798017 | |
ruby_2_4 0.6043389672413468 | |
ruby_2_4 0.6039576455950737 | |
trunk_oct 0.669595368206501 | |
trunk_oct 0.6659398227930069 | |
trunk_oct 0.6744274199008942 | |
trunk_oct 0.6669504605233669 | |
trunk_oct 0.6685555214062333 | |
trunk 0.6079981550574303 | |
trunk 0.6069057630375028 | |
trunk 0.6096790451556444 | |
trunk 0.6078688716515899 | |
trunk 0.6082294499501586 | |
modified 0.6126801799982786 | |
modified 0.6108460640534759 | |
modified 0.6114145591855049 | |
modified 0.6117470702156425 | |
modified 0.6101243132725358 | |
----------------------------------------------------------- | |
app_fib | |
def fib n | |
if n < 3 | |
1 | |
else | |
fib(n-1) + fib(n-2) | |
end | |
end | |
fib(34) | |
ruby_2_4 0.36114765889942646 | |
ruby_2_4 0.33853843063116074 | |
ruby_2_4 0.3421305660158396 | |
ruby_2_4 0.34071844164282084 | |
ruby_2_4 0.34828669764101505 | |
trunk_oct 0.4085798738524318 | |
trunk_oct 0.38410656433552504 | |
trunk_oct 0.39509366918355227 | |
trunk_oct 0.4005908276885748 | |
trunk_oct 0.38477741554379463 | |
trunk 0.4005790390074253 | |
trunk 0.39988459181040525 | |
trunk 0.4004660816863179 | |
trunk 0.3989400062710047 | |
trunk 0.4002835098654032 | |
modified 0.3631491204723716 | |
modified 0.35965136997401714 | |
modified 0.361650213599205 | |
modified 0.35752243362367153 | |
modified 0.36000645998865366 | |
----------------------------------------------------------- | |
app_lc_fizzbuzz | |
# | |
# FizzBuzz program using only lambda calculus | |
# | |
# This program is quoted from | |
# "Understanding Computation" by Tom Stuart | |
# http://computationbook.com/ | |
# | |
# You can understand why this program works fine by reading this book. | |
# | |
solution = -> k { -> f { -> f { -> x { f[-> y { x[x][y] }] }[-> x { f[-> y { x[x][y] }] }] }[-> f { -> l { -> x { -> g { -> b { b }[-> p { p[-> x { -> y { x } }] }[l]][x][-> y { g[f[-> l { -> p { p[-> x { -> y { y } }] }[-> p { p[-> x { -> y { y } }] }[l]] }[l]][x][g]][-> l { -> p { p[-> x { -> y { x } }] }[-> p { p[-> x { -> y { y } }] }[l]] }[l]][y] }] } } } }][k][-> x { -> y { -> f { f[x][y] } } }[-> x { -> y { x } }][-> x { -> y { x } }]][-> l { -> x { -> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[l][f[x]] } }] } }[-> f { -> x { f[-> y { x[x][y] }] }[-> x { f[-> y { x[x][y] }] }] }[-> f { -> m { -> n { -> b { b }[-> m { -> n { -> n { n[-> x { -> x { -> y { y } } }][-> x { -> y { x } }] }[-> m { -> n { n[-> n { -> p { p[-> x { -> y { x } }] }[n[-> p { -> x { -> y { -> f { f[x][y] } } }[-> p { p[-> x { -> y { y } }] }[p]][-> n { -> p { -> x { p[n[p][x]] } } }[-> p { p[-> x { -> y { y } }] }[p]]] }][-> x { -> y { -> f { f[x][y] } } }[-> p { -> x { x } }][-> p { -> x { x } }]]] }][m] } }[m][n]] } }[m][n]][-> x { -> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[f[-> n { -> p { -> x { p[n[p][x]] } } }[m]][n]][m][x] }][-> x { -> y { -> f { f[x][y] } } }[-> x { -> y { x } }][-> x { -> y { x } }]] } } }][-> p { -> x { p[x] } }][-> p { -> x { p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[x]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] } }]][-> n { -> b { b }[-> n { n[-> x { -> x { -> y { y } } }][-> x { -> y { x } }] }[-> f { -> x { f[-> y { x[x][y] }] }[-> x { f[-> y { x[x][y] }] }] }[-> f { -> m { -> n { -> b { b }[-> m { -> n { -> n { n[-> x { -> x { -> y { y } } }][-> x { -> y { x } }] }[-> m { -> n { n[-> n { -> p { p[-> x { -> y { x } }] }[n[-> p { -> x { -> y { -> f { f[x][y] } } }[-> p { p[-> x { -> y { y } }] }[p]][-> n { -> p { -> x { p[n[p][x]] } } }[-> p { p[-> x { -> y { y } }] }[p]]] }][-> x { -> y { -> f { f[x][y] } } }[-> p { -> x { x } }][-> p { -> x { x } }]]] }][m] } }[m][n]] } }[n][m]][-> x { f[-> m { -> n { n[-> n { -> p { p[-> x { -> y { x } }] }[n[-> p { -> x { -> y { -> f { f[x][y] } } }[-> p { p[-> x { -> y { y } }] }[p]][-> n { -> p { -> x { p[n[p][x]] } } }[-> p { p[-> x { -> y { y } }] }[p]]] }][-> x { -> y { -> f { f[x][y] } } }[-> p { -> x { x } }][-> p { -> x { x } }]]] }][m] } }[m][n]][n][x] }][m] } } }][n][-> p { -> x { p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[x]]]]]]]]]]]]]]] } }]]][-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> x { -> y { -> f { f[x][y] } } }[-> x { -> y { x } }][-> x { -> y { x } }]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]]]]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]]]]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]]]][-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]]]]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]]]]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]]][-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]][-> b { b }[-> n { n[-> x { -> x { -> y { y } } }][-> x { -> y { x } }] }[-> f { -> x { f[-> y { x[x][y] }] }[-> x { f[-> y { x[x][y] }] }] }[-> f { -> m { -> n { -> b { b }[-> m { -> n { -> n { n[-> x { -> x { -> y { y } } }][-> x { -> y { x } }] }[-> m { -> n { n[-> n { -> p { p[-> x { -> y { x } }] }[n[-> p { -> x { -> y { -> f { f[x][y] } } }[-> p { p[-> x { -> y { y } }] }[p]][-> n { -> p { -> x { p[n[p][x]] } } }[-> p { p[-> x { -> y { y } }] }[p]]] }][-> x { -> y { -> f { f[x][y] } } }[-> p { -> x { x } }][-> p { -> x { x } }]]] }][m] } }[m][n]] } }[n][m]][-> x { f[-> m { -> n { n[-> n { -> p { p[-> x { -> y { x } }] }[n[-> p { -> x { -> y { -> f { f[x][y] } } }[-> p { p[-> x { -> y { y } }] }[p]][-> n { -> p { -> x { p[n[p][x]] } } }[-> p { p[-> x { -> y { y } }] }[p]]] }][-> x { -> y { -> f { f[x][y] } } }[-> p { -> x { x } }][-> p { -> x { x } }]]] }][m] } }[m][n]][n][x] }][m] } } }][n][-> p { -> x { p[p[p[x]]] } }]]][-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> x { -> y { -> f { f[x][y] } } }[-> x { -> y { x } }][-> x { -> y { x } }]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]]]]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]]]]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]]][-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]][-> b { b }[-> n { n[-> x { -> x { -> y { y } } }][-> x { -> y { x } }] }[-> f { -> x { f[-> y { x[x][y] }] }[-> x { f[-> y { x[x][y] }] }] }[-> f { -> m { -> n { -> b { b }[-> m { -> n { -> n { n[-> x { -> x { -> y { y } } }][-> x { -> y { x } }] }[-> m { -> n { n[-> n { -> p { p[-> x { -> y { x } }] }[n[-> p { -> x { -> y { -> f { f[x][y] } } }[-> p { p[-> x { -> y { y } }] }[p]][-> n { -> p { -> x { p[n[p][x]] } } }[-> p { p[-> x { -> y { y } }] }[p]]] }][-> x { -> y { -> f { f[x][y] } } }[-> p { -> x { x } }][-> p { -> x { x } }]]] }][m] } }[m][n]] } }[n][m]][-> x { f[-> m { -> n { n[-> n { -> p { p[-> x { -> y { x } }] }[n[-> p { -> x { -> y { -> f { f[x][y] } } }[-> p { p[-> x { -> y { y } }] }[p]][-> n { -> p { -> x { p[n[p][x]] } } }[-> p { p[-> x { -> y { y } }] }[p]]] }][-> x { -> y { -> f { f[x][y] } } }[-> p { -> x { x } }][-> p { -> x { x } }]]] }][m] } }[m][n]][n][x] }][m] } } }][n][-> p { -> x { p[p[p[p[p[x]]]]] } }]]][-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> x { -> y { -> f { f[x][y] } } }[-> x { -> y { x } }][-> x { -> y { x } }]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]]]]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]]]]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]]]][-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]][-> f { -> x { f[-> y { x[x][y] }] }[-> x { f[-> y { x[x][y] }] }] }[-> f { -> n { -> l { -> x { -> f { -> x { f[-> y { x[x][y] }] }[-> x { f[-> y { x[x][y] }] }] }[-> f { -> l { -> x { -> g { -> b { b }[-> p { p[-> x { -> y { x } }] }[l]][x][-> y { g[f[-> l { -> p { p[-> x { -> y { y } }] }[-> p { p[-> x { -> y { y } }] }[l]] }[l]][x][g]][-> l { -> p { p[-> x { -> y { x } }] }[-> p { p[-> x { -> y { y } }] }[l]] }[l]][y] }] } } } }][l][-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> x { -> y { -> f { f[x][y] } } }[-> x { -> y { x } }][-> x { -> y { x } }]][x]][-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }] } }[-> b { b }[-> m { -> n { -> n { n[-> x { -> x { -> y { y } } }][-> x { -> y { x } }] }[-> m { -> n { n[-> n { -> p { p[-> x { -> y { x } }] }[n[-> p { -> x { -> y { -> f { f[x][y] } } }[-> p { p[-> x { -> y { y } }] }[p]][-> n { -> p { -> x { p[n[p][x]] } } }[-> p { p[-> x { -> y { y } }] }[p]]] }][-> x { -> y { -> f { f[x][y] } } }[-> p { -> x { x } }][-> p { -> x { x } }]]] }][m] } }[m][n]] } }[n][-> n { -> p { p[-> x { -> y { x } }] }[n[-> p { -> x { -> y { -> f { f[x][y] } } }[-> p { p[-> x { -> y { y } }] }[p]][-> n { -> p { -> x { p[n[p][x]] } } }[-> p { p[-> x { -> y { y } }] }[p]]] }][-> x { -> y { -> f { f[x][y] } } }[-> p { -> x { x } }][-> p { -> x { x } }]]] }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]][-> x { -> y { -> f { f[x][y] } } }[-> x { -> y { x } }][-> x { -> y { x } }]][-> x { f[-> f { -> x { f[-> y { x[x][y] }] }[-> x { f[-> y { x[x][y] }] }] }[-> f { -> m { -> n { -> b { b }[-> m { -> n { -> n { n[-> x { -> x { -> y { y } } }][-> x { -> y { x } }] }[-> m { -> n { n[-> n { -> p { p[-> x { -> y { x } }] }[n[-> p { -> x { -> y { -> f { f[x][y] } } }[-> p { p[-> x { -> y { y } }] }[p]][-> n { -> p { -> x { p[n[p][x]] } } }[-> p { p[-> x { -> y { y } }] }[p]]] }][-> x { -> y { -> f { f[x][y] } } }[-> p { -> x { x } }][-> p { -> x { x } }]]] }][m] } }[m][n]] } }[n][m]][-> x { -> n { -> p { -> x { p[n[p][x]] } } }[f[-> m { -> n { n[-> n { -> p { p[-> x { -> y { x } }] }[n[-> p { -> x { -> y { -> f { f[x][y] } } }[-> p { p[-> x { -> y { y } }] }[p]][-> n { -> p { -> x { p[n[p][x]] } } }[-> p { p[-> x { -> y { y } }] }[p]]] }][-> x { -> y { -> f { f[x][y] } } }[-> p { -> x { x } }][-> p { -> x { x } }]]] }][m] } }[m][n]][n]][x] }][-> p { -> x { x } }] } } }][n][-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]][x] }]][-> f { -> x { f[-> y { x[x][y] }] }[-> x { f[-> y { x[x][y] }] }] }[-> f { -> m { -> n { -> b { b }[-> m { -> n { -> n { n[-> x { -> x { -> y { y } } }][-> x { -> y { x } }] }[-> m { -> n { n[-> n { -> p { p[-> x { -> y { x } }] }[n[-> p { -> x { -> y { -> f { f[x][y] } } }[-> p { p[-> x { -> y { y } }] }[p]][-> n { -> p { -> x { p[n[p][x]] } } }[-> p { p[-> x { -> y { y } }] }[p]]] }][-> x { -> y { -> f { f[x][y] } } }[-> p { -> x { x } }][-> p { -> x { x } }]]] }][m] } }[m][n]] } }[n][m]][-> x { f[-> m { -> n { n[-> n { -> p { p[-> x { -> y { x } }] }[n[-> p { -> x { -> y { -> f { f[x][y] } } }[-> p { p[-> x { -> y { y } }] }[p]][-> n { -> p { -> x { p[n[p][x]] } } }[-> p { p[-> x { -> y { y } }] }[p]]] }][-> x { -> y { -> f { f[x][y] } } }[-> p { -> x { x } }][-> p { -> x { x } }]]] }][m] } }[m][n]][n][x] }][m] } } }][n][-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]] } }][n]]]] }] | |
FIRST = -> l { LEFT[RIGHT[l]] } | |
IF = -> b { b } | |
LEFT = -> p { p[-> x { -> y { x } } ] } | |
RIGHT = -> p { p[-> x { -> y { y } } ] } | |
IS_EMPTY = LEFT | |
REST = -> l { RIGHT[RIGHT[l]] } | |
def to_integer(proc) | |
proc[-> n { n + 1 }][0] | |
end | |
def to_boolean(proc) | |
IF[proc][true][false] | |
end | |
def to_array(proc) | |
array = [] | |
until to_boolean(IS_EMPTY[proc]) | |
array.push(FIRST[proc]) | |
proc = REST[proc] | |
end | |
array | |
end | |
def to_char(c) | |
'0123456789BFiuz'.slice(to_integer(c)) | |
end | |
def to_string(s) | |
to_array(s).map { |c| to_char(c) }.join | |
end | |
answer = to_array(solution).map do |p| | |
to_string(p) | |
end | |
answer_ary = answer.to_a | |
# puts answer_ary | |
ruby_2_4 36.53207976743579 | |
ruby_2_4 37.89537764713168 | |
ruby_2_4 36.723573193885386 | |
ruby_2_4 38.48227261565626 | |
ruby_2_4 36.90794064849615 | |
trunk_oct 36.873438694514334 | |
trunk_oct 36.245762643404305 | |
trunk_oct 35.49768565688282 | |
trunk_oct 35.30468615423888 | |
trunk_oct 34.43972430471331 | |
trunk 33.43890817370266 | |
trunk 32.89311058353633 | |
trunk 34.13755172677338 | |
trunk 36.41347415372729 | |
trunk 34.11650806944817 | |
modified 33.69486961700022 | |
modified 33.82463005371392 | |
modified 33.184486526064575 | |
modified 32.46442792471498 | |
modified 31.319396573118865 | |
----------------------------------------------------------- | |
app_mandelbrot | |
require 'complex' | |
def mandelbrot? z | |
i = 0 | |
while i<100 | |
i += 1 | |
z = z * z | |
return false if z.abs > 2 | |
end | |
true | |
end | |
ary = [] | |
(0..1000).each{|dx| | |
(0..1000).each{|dy| | |
x = dx / 50.0 | |
y = dy / 50.0 | |
c = Complex(x, y) | |
ary << c if mandelbrot?(c) | |
} | |
} | |
ruby_2_4 0.925727934576571 | |
ruby_2_4 0.9439300484955311 | |
ruby_2_4 0.9091543704271317 | |
ruby_2_4 0.9452749313786626 | |
ruby_2_4 0.9127898877486587 | |
trunk_oct 0.9456870397552848 | |
trunk_oct 0.9509583497419953 | |
trunk_oct 0.9463692363351583 | |
trunk_oct 0.9440803667530417 | |
trunk_oct 0.9558739792555571 | |
trunk 0.952283376827836 | |
trunk 0.9713358459994197 | |
trunk 0.9485433483496308 | |
trunk 0.9530115472152829 | |
trunk 0.9520656513050199 | |
modified 0.9396216114982963 | |
modified 0.9364266060292721 | |
modified 0.9358242331072688 | |
modified 0.9580141827464104 | |
modified 0.9555799597874284 | |
----------------------------------------------------------- | |
app_pentomino | |
#!/usr/local/bin/ruby | |
# This program is contributed by Shin Nishiyama | |
# modified by K.Sasada | |
NP = 5 | |
ROW = 8 + NP | |
COL = 8 | |
$p = [] | |
$b = [] | |
$no = 0 | |
def piece(n, a, nb) | |
nb.each{|x| | |
a[n] = x | |
if n == NP-1 | |
$p << [a.sort] | |
else | |
nbc=nb.dup | |
[-ROW, -1, 1, ROW].each{|d| | |
if x+d > 0 and not a.include?(x+d) and not nbc.include?(x+d) | |
nbc << x+d | |
end | |
} | |
nbc.delete x | |
piece(n+1,a[0..n],nbc) | |
end | |
} | |
end | |
def kikaku(a) | |
a.collect {|x| x - a[0]} | |
end | |
def ud(a) | |
kikaku(a.collect {|x| ((x+NP)%ROW)-ROW*((x+NP)/ROW) }.sort) | |
end | |
def rl(a) | |
kikaku(a.collect {|x| ROW*((x+NP)/ROW)+ROW-((x+NP)%ROW)}.sort) | |
end | |
def xy(a) | |
kikaku(a.collect {|x| ROW*((x+NP)%ROW) + (x+NP)/ROW }.sort) | |
end | |
def mkpieces | |
piece(0,[],[0]) | |
$p.each do |a| | |
a0 = a[0] | |
a[1] = ud(a0) | |
a[2] = rl(a0) | |
a[3] = ud(rl(a0)) | |
a[4] = xy(a0) | |
a[5] = ud(xy(a0)) | |
a[6] = rl(xy(a0)) | |
a[7] = ud(rl(xy(a0))) | |
a.sort! | |
a.uniq! | |
end | |
$p.uniq!.sort! {|x,y| x[0] <=> y[0] } | |
end | |
def mkboard | |
(0...ROW*COL).each{|i| | |
if i % ROW >= ROW-NP | |
$b[i] = -2 | |
else | |
$b[i] = -1 | |
end | |
$b[3*ROW+3]=$b[3*ROW+4]=$b[4*ROW+3]=$b[4*ROW+4]=-2 | |
} | |
end | |
def pboard | |
return # skip print | |
print "No. #$no\n" | |
(0...COL).each{|i| | |
print "|" | |
(0...ROW-NP).each{|j| | |
x = $b[i*ROW+j] | |
if x < 0 | |
print "..|" | |
else | |
printf "%2d|",x+1 | |
end | |
} | |
print "\n" | |
} | |
print "\n" | |
end | |
$pnum=[] | |
def setpiece(a,pos) | |
if a.length == $p.length then | |
$no += 1 | |
pboard | |
return | |
end | |
while $b[pos] != -1 | |
pos += 1 | |
end | |
($pnum - a).each do |i| | |
$p[i].each do |x| | |
f = 0 | |
x.each{|s| | |
if $b[pos+s] != -1 | |
f=1 | |
break | |
end | |
} | |
if f == 0 then | |
x.each{|s| | |
$b[pos+s] = i | |
} | |
a << i | |
setpiece(a.dup, pos) | |
a.pop | |
x.each{|s| | |
$b[pos+s] = -1 | |
} | |
end | |
end | |
end | |
end | |
mkpieces | |
mkboard | |
$p[4] = [$p[4][0]] | |
$pnum = (0...$p.length).to_a | |
setpiece([],0) | |
__END__ | |
# original | |
NP = 5 | |
ROW = 8 + NP | |
COL = 8 | |
$p = [] | |
$b = [] | |
$no = 0 | |
def piece(n,a,nb) | |
for x in nb | |
a[n] = x | |
if n == NP-1 | |
$p << [a.sort] | |
else | |
nbc=nb.dup | |
for d in [-ROW, -1, 1, ROW] | |
if x+d > 0 and not a.include?(x+d) and not nbc.include?(x+d) | |
nbc << x+d | |
end | |
end | |
nbc.delete x | |
piece(n+1,a[0..n],nbc) | |
end | |
end | |
end | |
def kikaku(a) | |
a.collect {|x| x - a[0]} | |
end | |
def ud(a) | |
kikaku(a.collect {|x| ((x+NP)%ROW)-ROW*((x+NP)/ROW) }.sort) | |
end | |
def rl(a) | |
kikaku(a.collect {|x| ROW*((x+NP)/ROW)+ROW-((x+NP)%ROW)}.sort) | |
end | |
def xy(a) | |
kikaku(a.collect {|x| ROW*((x+NP)%ROW) + (x+NP)/ROW }.sort) | |
end | |
def mkpieces | |
piece(0,[],[0]) | |
$p.each do |a| | |
a0 = a[0] | |
a[1] = ud(a0) | |
a[2] = rl(a0) | |
a[3] = ud(rl(a0)) | |
a[4] = xy(a0) | |
a[5] = ud(xy(a0)) | |
a[6] = rl(xy(a0)) | |
a[7] = ud(rl(xy(a0))) | |
a.sort! | |
a.uniq! | |
end | |
$p.uniq!.sort! {|x,y| x[0] <=> y[0] } | |
end | |
def mkboard | |
for i in 0...ROW*COL | |
if i % ROW >= ROW-NP | |
$b[i] = -2 | |
else | |
$b[i] = -1 | |
end | |
$b[3*ROW+3]=$b[3*ROW+4]=$b[4*ROW+3]=$b[4*ROW+4]=-2 | |
end | |
end | |
def pboard | |
print "No. #$no\n" | |
for i in 0...COL | |
print "|" | |
for j in 0...ROW-NP | |
x = $b[i*ROW+j] | |
if x < 0 | |
print "..|" | |
else | |
printf "%2d|",x+1 | |
end | |
end | |
print "\n" | |
end | |
print "\n" | |
end | |
$pnum=[] | |
def setpiece(a,pos) | |
if a.length == $p.length then | |
$no += 1 | |
pboard | |
return | |
end | |
while $b[pos] != -1 | |
pos += 1 | |
end | |
($pnum - a).each do |i| | |
$p[i].each do |x| | |
f = 0 | |
for s in x do | |
if $b[pos+s] != -1 | |
f=1 | |
break | |
end | |
end | |
if f == 0 then | |
for s in x do | |
$b[pos+s] = i | |
end | |
a << i | |
setpiece(a.dup, pos) | |
a.pop | |
for s in x do | |
$b[pos+s] = -1 | |
end | |
end | |
end | |
end | |
end | |
mkpieces | |
mkboard | |
$p[4] = [$p[4][0]] | |
$pnum = (0...$p.length).to_a | |
setpiece([],0) | |
ruby_2_4 10.340436936356127 | |
ruby_2_4 10.26072520390153 | |
ruby_2_4 10.40820305235684 | |
ruby_2_4 10.290426510386169 | |
ruby_2_4 10.318881308659911 | |
trunk_oct 10.564207458868623 | |
trunk_oct 10.45787581242621 | |
trunk_oct 10.485318578779697 | |
trunk_oct 10.420554504729807 | |
trunk_oct 10.618309519253671 | |
trunk 10.273468842729926 | |
trunk 10.102290431037545 | |
trunk 10.127600049600005 | |
trunk 10.193915856070817 | |
trunk 10.167326777242124 | |
modified 9.924994584172964 | |
modified 9.929463713429868 | |
modified 9.918480903841555 | |
modified 9.88340763002634 | |
modified 9.879915663972497 | |
----------------------------------------------------------- | |
app_raise | |
i = 0 | |
while i<300000 | |
i += 1 | |
begin | |
raise | |
rescue | |
end | |
end | |
ruby_2_4 0.17838600184768438 | |
ruby_2_4 0.17501006741076708 | |
ruby_2_4 0.17996628675609827 | |
ruby_2_4 0.18227750342339277 | |
ruby_2_4 0.17908358480781317 | |
trunk_oct 0.1874496778473258 | |
trunk_oct 0.19084734097123146 | |
trunk_oct 0.18677002470940351 | |
trunk_oct 0.18702173512429 | |
trunk_oct 0.1870880899950862 | |
trunk 0.18548655975610018 | |
trunk 0.18686705827713013 | |
trunk 0.18463914841413498 | |
trunk 0.18457612302154303 | |
trunk 0.1846449924632907 | |
modified 0.18765069358050823 | |
modified 0.18769632186740637 | |
modified 0.18800458870828152 | |
modified 0.1883128797635436 | |
modified 0.1892009163275361 | |
----------------------------------------------------------- | |
app_strconcat | |
i = 0 | |
while i<2_000_000 | |
"#{1+1} #{1+1} #{1+1}" | |
i += 1 | |
end | |
ruby_2_4 0.7654742449522018 | |
ruby_2_4 0.7948119519278407 | |
ruby_2_4 0.7673031808808446 | |
ruby_2_4 0.7640487998723984 | |
ruby_2_4 0.7711082641035318 | |
trunk_oct 0.7626644130796194 | |
trunk_oct 0.7309178821742535 | |
trunk_oct 0.7315988969057798 | |
trunk_oct 0.7351448154076934 | |
trunk_oct 0.7301147468388081 | |
trunk 0.7378271007910371 | |
trunk 0.7387549160048366 | |
trunk 0.7378970254212618 | |
trunk 0.7387903444468975 | |
trunk 0.7387805189937353 | |
modified 0.7293761782348156 | |
modified 0.7338413437828422 | |
modified 0.7358414940536022 | |
modified 0.7298681391403079 | |
modified 0.7283730050548911 | |
----------------------------------------------------------- | |
app_tak | |
def tak x, y, z | |
unless y < x | |
z | |
else | |
tak( tak(x-1, y, z), | |
tak(y-1, z, x), | |
tak(z-1, x, y)) | |
end | |
end | |
tak(18, 9, 0) | |
ruby_2_4 0.5038435598835349 | |
ruby_2_4 0.5028090076521039 | |
ruby_2_4 0.5219125980511308 | |
ruby_2_4 0.5068032648414373 | |
ruby_2_4 0.5048781149089336 | |
trunk_oct 0.5110951131209731 | |
trunk_oct 0.5248937616124749 | |
trunk_oct 0.5222185803577304 | |
trunk_oct 0.5302830990403891 | |
trunk_oct 0.5173734966665506 | |
trunk 0.5375435454770923 | |
trunk 0.5497156092897058 | |
trunk 0.5430646222084761 | |
trunk 0.5374544756487012 | |
trunk 0.5364547353237867 | |
modified 0.49949335400015116 | |
modified 0.5008256258442998 | |
modified 0.5009597418829799 | |
modified 0.5101037258282304 | |
modified 0.501644229516387 | |
----------------------------------------------------------- | |
app_tarai | |
def tarai( x, y, z ) | |
if x <= y | |
then y | |
else tarai(tarai(x-1, y, z), | |
tarai(y-1, z, x), | |
tarai(z-1, x, y)) | |
end | |
end | |
tarai(12, 6, 0) | |
ruby_2_4 0.4232830246910453 | |
ruby_2_4 0.4196279076859355 | |
ruby_2_4 0.4227399108931422 | |
ruby_2_4 0.4237120309844613 | |
ruby_2_4 0.42692682426422834 | |
trunk_oct 0.44046545308083296 | |
trunk_oct 0.45594013575464487 | |
trunk_oct 0.4436839232221246 | |
trunk_oct 0.46460551489144564 | |
trunk_oct 0.43735334277153015 | |
trunk 0.46855807211250067 | |
trunk 0.4719211347401142 | |
trunk 0.47725564520806074 | |
trunk 0.47434646636247635 | |
trunk 0.4816421000286937 | |
modified 0.4196786815300584 | |
modified 0.4139177994802594 | |
modified 0.4215358402580023 | |
modified 0.41485053300857544 | |
modified 0.41740911919623613 | |
----------------------------------------------------------- | |
app_uri | |
require 'uri' | |
100_000.times{ | |
uri = URI.parse('http://www.ruby-lang.org') | |
uri.scheme | |
uri.host | |
uri.port | |
} | |
ruby_2_4 0.46180492267012596 | |
ruby_2_4 0.4573489334434271 | |
ruby_2_4 0.4546288913115859 | |
ruby_2_4 0.4528842447325587 | |
ruby_2_4 0.4509422993287444 | |
trunk_oct 0.4815033273771405 | |
trunk_oct 0.47097593266516924 | |
trunk_oct 0.4757920615375042 | |
trunk_oct 0.466670636087656 | |
trunk_oct 0.470277750864625 | |
trunk 0.45849289186298847 | |
trunk 0.4616105295717716 | |
trunk 0.45852625742554665 | |
trunk 0.4658892685547471 | |
trunk 0.4568141447380185 | |
modified 0.46998004242777824 | |
modified 0.46345530450344086 | |
modified 0.4554989682510495 | |
modified 0.45493804942816496 | |
modified 0.45752451941370964 | |
----------------------------------------------------------- | |
array_sample_100k_10 | |
arr = [*0...100000] | |
10_000.times {arr.sample 10} | |
ruby_2_4 0.02950125839561224 | |
ruby_2_4 0.0292540080845356 | |
ruby_2_4 0.029195214621722698 | |
ruby_2_4 0.029124343767762184 | |
ruby_2_4 0.029260456562042236 | |
trunk_oct 0.03751176968216896 | |
trunk_oct 0.03737057093530893 | |
trunk_oct 0.03721648082137108 | |
trunk_oct 0.03718503285199404 | |
trunk_oct 0.03719606250524521 | |
trunk 0.03838095162063837 | |
trunk 0.03798821475356817 | |
trunk 0.038725041784346104 | |
trunk 0.03827290236949921 | |
trunk 0.03830507304519415 | |
modified 0.04066624119877815 | |
modified 0.040673685260117054 | |
modified 0.04057355597615242 | |
modified 0.040464249439537525 | |
modified 0.04056987911462784 | |
----------------------------------------------------------- | |
array_sample_100k_11 | |
arr = [*0...100000] | |
10_000.times {arr.sample 11} | |
ruby_2_4 0.6606828169897199 | |
ruby_2_4 0.6488657798618078 | |
ruby_2_4 0.6510301260277629 | |
ruby_2_4 0.6499084252864122 | |
ruby_2_4 0.6423075329512358 | |
trunk_oct 0.041237770579755306 | |
trunk_oct 0.04111320525407791 | |
trunk_oct 0.041138594038784504 | |
trunk_oct 0.041162275709211826 | |
trunk_oct 0.040904912166297436 | |
trunk 0.04134767409414053 | |
trunk 0.04158247448503971 | |
trunk 0.04145221598446369 | |
trunk 0.04133627377450466 | |
trunk 0.04167115967720747 | |
modified 0.043928662315011024 | |
modified 0.04390209075063467 | |
modified 0.04394834581762552 | |
modified 0.04403913952410221 | |
modified 0.043743777088820934 | |
----------------------------------------------------------- | |
array_sample_100k__100 | |
arr = [*0...100000] | |
10_000.times {arr.sample 100} | |
ruby_2_4 0.6623934572562575 | |
ruby_2_4 0.6640799958258867 | |
ruby_2_4 0.6602982878684998 | |
ruby_2_4 0.6600730195641518 | |
ruby_2_4 0.6696218233555555 | |
trunk_oct 0.08090994041413069 | |
trunk_oct 0.08101366087794304 | |
trunk_oct 0.08157859649509192 | |
trunk_oct 0.08113863784819841 | |
trunk_oct 0.08121221698820591 | |
trunk 0.08170587196946144 | |
trunk 0.08162978943437338 | |
trunk 0.0808451259508729 | |
trunk 0.08087221439927816 | |
trunk 0.08096039108932018 | |
modified 0.083500437438488 | |
modified 0.08393660746514797 | |
modified 0.08398211933672428 | |
modified 0.08396678324788809 | |
modified 0.0843675248324871 | |
----------------------------------------------------------- | |
array_sample_100k__1k | |
arr = [*0...100000] | |
10_000.times {arr.sample 1000} | |
ruby_2_4 0.8079767534509301 | |
ruby_2_4 0.8053814945742488 | |
ruby_2_4 0.8116927854716778 | |
ruby_2_4 0.8043063106015325 | |
ruby_2_4 0.8095842115581036 | |
trunk_oct 0.49835555255413055 | |
trunk_oct 0.5142400227487087 | |
trunk_oct 0.498779209330678 | |
trunk_oct 0.4986087568104267 | |
trunk_oct 0.4983958415687084 | |
trunk 0.49240061920136213 | |
trunk 0.4967837706208229 | |
trunk 0.4985520299524069 | |
trunk 0.49130321107804775 | |
trunk 0.49092247523367405 | |
modified 0.5003009000793099 | |
modified 0.49788558296859264 | |
modified 0.4979515112936497 | |
modified 0.503381634131074 | |
modified 0.49630678445100784 | |
----------------------------------------------------------- | |
array_sample_100k__6k | |
arr = [*0...100000] | |
10_000.times {arr.sample 6000} | |
ruby_2_4 1.5716388328000903 | |
ruby_2_4 1.5782960345968604 | |
ruby_2_4 1.578008184209466 | |
ruby_2_4 1.5681307911872864 | |
ruby_2_4 1.5721359457820654 | |
trunk_oct 1.5956734726205468 | |
trunk_oct 1.5903776213526726 | |
trunk_oct 1.5994160855188966 | |
trunk_oct 1.5982768889516592 | |
trunk_oct 1.6031629657372832 | |
trunk 1.5789744956418872 | |
trunk 1.5713908076286316 | |
trunk 1.5625593094155192 | |
trunk 1.5745469778776169 | |
trunk 1.5728356903418899 | |
modified 1.5852369805797935 | |
modified 1.575236569158733 | |
modified 1.577095023356378 | |
modified 1.5689958641305566 | |
modified 1.5718932738527656 | |
----------------------------------------------------------- | |
array_sample_100k___10k | |
arr = [*0...100000] | |
10_000.times {arr.sample 10_000} | |
ruby_2_4 2.205017488449812 | |
ruby_2_4 2.171666132286191 | |
ruby_2_4 2.1659449748694897 | |
ruby_2_4 2.165872278623283 | |
ruby_2_4 2.1669661132618785 | |
trunk_oct 2.204504747875035 | |
trunk_oct 2.194258383475244 | |
trunk_oct 2.1962699303403497 | |
trunk_oct 2.195070507004857 | |
trunk_oct 2.249415007419884 | |
trunk 2.1587591804564 | |
trunk 2.1593775739893317 | |
trunk 2.160155759193003 | |
trunk 2.1610017055645585 | |
trunk 2.15755879227072 | |
modified 2.1717774234712124 | |
modified 2.3299802094697952 | |
modified 2.163971151225269 | |
modified 2.158941427245736 | |
modified 2.1660576751455665 | |
----------------------------------------------------------- | |
array_sample_100k___50k | |
arr = [*0...100000] | |
10_000.times {arr.sample 50_000} | |
ruby_2_4 7.809174820780754 | |
ruby_2_4 7.806549916043878 | |
ruby_2_4 7.715758080594242 | |
ruby_2_4 7.755669089965522 | |
ruby_2_4 7.783610421232879 | |
trunk_oct 7.958461046218872 | |
trunk_oct 7.94976463355124 | |
trunk_oct 7.8647908344864845 | |
trunk_oct 7.912963852286339 | |
trunk_oct 7.913691173307598 | |
trunk 7.787658085115254 | |
trunk 7.74038855265826 | |
trunk 7.752917944453657 | |
trunk 7.768044015392661 | |
trunk 7.820888922549784 | |
modified 7.844436853192747 | |
modified 7.786277565173805 | |
modified 7.81502278149128 | |
modified 7.845739766955376 | |
modified 7.853899677284062 | |
----------------------------------------------------------- | |
array_shift | |
require 'benchmark' | |
Benchmark.bm do |x| | |
[10_000,1_000_000,100_000_000].each do |n| | |
ary = Array.new(n,0) | |
GC.start | |
x.report("#{n}:shift"){ ary.shift } | |
(0..4).each do |i| | |
ary = Array.new(n,0) | |
GC.start | |
x.report("#{n}:shift(#{i})"){ ary.shift(i) } | |
end | |
end | |
end | |
ruby_2_4 3.5863759266212583 | |
ruby_2_4 3.6033725421875715 | |
ruby_2_4 3.594981645233929 | |
ruby_2_4 3.617394160479307 | |
ruby_2_4 3.602064718492329 | |
trunk_oct 3.792987175285816 | |
trunk_oct 3.6687114080414176 | |
trunk_oct 3.6558352252468467 | |
trunk_oct 3.6526988577097654 | |
trunk_oct 3.6570083051919937 | |
trunk 1.961324568837881 | |
trunk 1.9620508551597595 | |
trunk 1.9623122792690992 | |
trunk 1.960218240506947 | |
trunk 2.0169059075415134 | |
modified 1.9611085494980216 | |
modified 1.9610675629228354 | |
modified 1.9606889793649316 | |
modified 1.9566379748284817 | |
modified 1.9610895654186606 | |
----------------------------------------------------------- | |
array_small_and | |
MIN_SIZE = ENV.fetch('SMALL_ARRAY_MIN', 0).to_i | |
MAX_SIZE = ENV.fetch('SMALL_ARRAY_MAX', 16).to_i | |
ITERATIONS = ENV.fetch('SMALL_ARRAY_ITERATIONS', 100).to_i | |
ARRAYS = (MIN_SIZE..MAX_SIZE).map do |size1| | |
(MIN_SIZE..MAX_SIZE).map do |size2| | |
[Array.new(size1) { rand(MAX_SIZE) }, Array.new(size2) { rand(MAX_SIZE) }] | |
end | |
end | |
ITERATIONS.times do | |
ARRAYS.each do |group| | |
group.each do |arr1, arr2| | |
arr1 & arr2 | |
end | |
end | |
end | |
ruby_2_4 0.04314385913312435 | |
ruby_2_4 0.042992763221263885 | |
ruby_2_4 0.04247965291142464 | |
ruby_2_4 0.04251945484429598 | |
ruby_2_4 0.04269628319889307 | |
trunk_oct 0.04317949339747429 | |
trunk_oct 0.04326737951487303 | |
trunk_oct 0.043151671066880226 | |
trunk_oct 0.04343361593782902 | |
trunk_oct 0.04334050323814154 | |
trunk 0.04446489177644253 | |
trunk 0.04405117221176624 | |
trunk 0.044496748596429825 | |
trunk 0.0441123666241765 | |
trunk 0.04398850444704294 | |
modified 0.04639121983200312 | |
modified 0.04621213115751743 | |
modified 0.04610369727015495 | |
modified 0.046426533721387386 | |
modified 0.046094074845314026 | |
----------------------------------------------------------- | |
array_small_diff | |
MIN_SIZE = ENV.fetch('SMALL_ARRAY_MIN', 0).to_i | |
MAX_SIZE = ENV.fetch('SMALL_ARRAY_MAX', 16).to_i | |
ITERATIONS = ENV.fetch('SMALL_ARRAY_ITERATIONS', 100).to_i | |
ARRAYS = (MIN_SIZE..MAX_SIZE).map do |size1| | |
(MIN_SIZE..MAX_SIZE).map do |size2| | |
[Array.new(size1) { rand(MAX_SIZE) }, Array.new(size2) { rand(MAX_SIZE) }] | |
end | |
end | |
ITERATIONS.times do | |
ARRAYS.each do |group| | |
group.each do |arr1, arr2| | |
arr1 - arr2 | |
end | |
end | |
end | |
ruby_2_4 0.04579384531825781 | |
ruby_2_4 0.04583666939288378 | |
ruby_2_4 0.04647925868630409 | |
ruby_2_4 0.04598063975572586 | |
ruby_2_4 0.045941867865622044 | |
trunk_oct 0.04417698085308075 | |
trunk_oct 0.04424693714827299 | |
trunk_oct 0.044360662810504436 | |
trunk_oct 0.04433419741690159 | |
trunk_oct 0.044364359229803085 | |
trunk 0.04526221193373203 | |
trunk 0.04504249710589647 | |
trunk 0.0447850376367569 | |
trunk 0.04534667916595936 | |
trunk 0.04528128355741501 | |
modified 0.04730869736522436 | |
modified 0.0474362438544631 | |
modified 0.04752052389085293 | |
modified 0.04742819629609585 | |
modified 0.047524972818791866 | |
----------------------------------------------------------- | |
array_small_or | |
MIN_SIZE = ENV.fetch('SMALL_ARRAY_MIN', 0).to_i | |
MAX_SIZE = ENV.fetch('SMALL_ARRAY_MAX', 16).to_i | |
ITERATIONS = ENV.fetch('SMALL_ARRAY_ITERATIONS', 100).to_i | |
ARRAYS = (MIN_SIZE..MAX_SIZE).map do |size1| | |
(MIN_SIZE..MAX_SIZE).map do |size2| | |
[Array.new(size1) { rand(MAX_SIZE) }, Array.new(size2) { rand(MAX_SIZE) }] | |
end | |
end | |
ITERATIONS.times do | |
ARRAYS.each do |group| | |
group.each do |arr1, arr2| | |
arr1 | arr2 | |
end | |
end | |
end | |
ruby_2_4 0.04941077437251806 | |
ruby_2_4 0.0490758428350091 | |
ruby_2_4 0.0483282245695591 | |
ruby_2_4 0.048524326644837856 | |
ruby_2_4 0.04835126083344221 | |
trunk_oct 0.05159367062151432 | |
trunk_oct 0.050720677711069584 | |
trunk_oct 0.050714993849396706 | |
trunk_oct 0.050847786478698254 | |
trunk_oct 0.05077840015292168 | |
trunk 0.052041953429579735 | |
trunk 0.052027663215994835 | |
trunk 0.05208864528685808 | |
trunk 0.05207608733326197 | |
trunk 0.05212043598294258 | |
modified 0.054272521287202835 | |
modified 0.054302056320011616 | |
modified 0.05433242954313755 | |
modified 0.05439317785203457 | |
modified 0.05421718955039978 | |
----------------------------------------------------------- | |
array_sort_block | |
ary = Array.new(1000) { rand(1000) } | |
10000.times { ary.sort { |a, b| a <=> b } } | |
ruby_2_4 4.990935520268977 | |
ruby_2_4 5.008760734461248 | |
ruby_2_4 5.002211184240878 | |
ruby_2_4 5.031768757849932 | |
ruby_2_4 5.010361919179559 | |
trunk_oct 4.620776174589992 | |
trunk_oct 4.6228157775476575 | |
trunk_oct 4.628693396225572 | |
trunk_oct 4.634254821576178 | |
trunk_oct 4.6398517601192 | |
trunk 4.6604104693979025 | |
trunk 4.6803290052339435 | |
trunk 4.695919220335782 | |
trunk 4.698329074308276 | |
trunk 4.676961782388389 | |
modified 4.465667547658086 | |
modified 4.4563381634652615 | |
modified 4.457205110229552 | |
modified 4.442073345184326 | |
modified 4.43261747341603 | |
----------------------------------------------------------- | |
array_sort_float | |
arr = Array.new(1000) { rand } | |
10000.times { arr.sort } | |
ruby_2_4 2.9691732367500663 | |
ruby_2_4 2.9651240250095725 | |
ruby_2_4 2.9431838244199753 | |
ruby_2_4 2.973076667636633 | |
ruby_2_4 2.967228399589658 | |
trunk_oct 1.5360774910077453 | |
trunk_oct 1.5372640900313854 | |
trunk_oct 1.5914093377068639 | |
trunk_oct 1.530824408866465 | |
trunk_oct 1.540001641958952 | |
trunk 1.6600666958838701 | |
trunk 1.558536239899695 | |
trunk 1.5544176446273923 | |
trunk 1.564120912924409 | |
trunk 1.5635378854349256 | |
modified 1.5336211854591966 | |
modified 1.5208673346787691 | |
modified 1.5700370520353317 | |
modified 1.531577586196363 | |
modified 1.5355555731803179 | |
----------------------------------------------------------- | |
bighash | |
h = {}; 5000000.times {|n| h[n] = n } | |
ruby_2_4 1.1658156188204885 | |
ruby_2_4 1.1619386924430728 | |
ruby_2_4 1.1778438221663237 | |
ruby_2_4 1.177191092632711 | |
ruby_2_4 1.1696994761005044 | |
trunk_oct 1.1916822316125035 | |
trunk_oct 1.1992708332836628 | |
trunk_oct 1.1910538002848625 | |
trunk_oct 1.2156227435916662 | |
trunk_oct 1.1998401647433639 | |
trunk 1.2078109737485647 | |
trunk 1.2166875256225467 | |
trunk 1.2052306067198515 | |
trunk 1.206314828246832 | |
trunk 1.2102624317631125 | |
modified 1.211957766674459 | |
modified 1.2027070298790932 | |
modified 1.2055514501407743 | |
modified 1.2117169462144375 | |
modified 1.2023955518379807 | |
----------------------------------------------------------- | |
dir_empty_p | |
require 'tmpdir' | |
max = 100_000 | |
Dir.mktmpdir('bm_dir_empty_p') do |dir| | |
max.times { Dir.empty?(dir) } | |
end | |
ruby_2_4 0.22107713297009468 | |
ruby_2_4 0.20824912749230862 | |
ruby_2_4 0.21443202625960112 | |
ruby_2_4 0.2158330800011754 | |
ruby_2_4 0.2104991702362895 | |
trunk_oct 0.22432265151292086 | |
trunk_oct 0.2660670196637511 | |
trunk_oct 0.21744792722165585 | |
trunk_oct 0.21820032969117165 | |
trunk_oct 0.21739510353654623 | |
trunk 0.22934256959706545 | |
trunk 0.2406091457232833 | |
trunk 0.22949449252337217 | |
trunk 0.22903573978692293 | |
trunk 0.23602640721946955 | |
modified 0.2354406053200364 | |
modified 0.23155706655234098 | |
modified 0.2339407168328762 | |
modified 0.23286220338195562 | |
modified 0.23001439403742552 | |
----------------------------------------------------------- | |
erb_render | |
require 'erb' | |
data = DATA.read | |
max = 1_500_000 | |
title = "hello world!" | |
content = "hello world!\n" * 10 | |
src = "def self.render(title, content); #{ERB.new(data).src}; end" | |
mod = Module.new | |
mod.instance_eval(src, "(ERB)") | |
max.times do | |
mod.render(title, content) | |
end | |
__END__ | |
<html> | |
<head> <%= title %> </head> | |
<body> | |
<h1> <%= title %> </h1> | |
<p> | |
<%= content %> | |
</p> | |
</body> | |
</html> | |
ruby_2_4 2.648871618323028 | |
ruby_2_4 2.601091149263084 | |
ruby_2_4 2.6083217319101095 | |
ruby_2_4 2.6274924371391535 | |
ruby_2_4 2.6040284829214215 | |
trunk_oct 1.0657949335873127 | |
trunk_oct 1.075893527828157 | |
trunk_oct 1.0614414513111115 | |
trunk_oct 1.099606178700924 | |
trunk_oct 1.064248469658196 | |
trunk 1.084544393233955 | |
trunk 1.0845027780160308 | |
trunk 1.0832743281498551 | |
trunk 1.1745046861469746 | |
trunk 1.0948968958109617 | |
modified 1.2614368768408895 | |
modified 1.0565239069983363 | |
modified 1.0615467857569456 | |
modified 1.065241951495409 | |
modified 1.1145551661029458 | |
----------------------------------------------------------- | |
file_chmod | |
# chmod file | |
require 'tempfile' | |
max = 200_000 | |
tmp = Tempfile.new('chmod') | |
path = tmp.path | |
max.times do | |
File.chmod(0777, path) | |
end | |
tmp.close! | |
ruby_2_4 0.19015854876488447 | |
ruby_2_4 0.19285294879227877 | |
ruby_2_4 0.1905073681846261 | |
ruby_2_4 0.19568252936005592 | |
ruby_2_4 0.19243267178535461 | |
trunk_oct 0.2016332894563675 | |
trunk_oct 0.19890588708221912 | |
trunk_oct 0.20081097353249788 | |
trunk_oct 0.2001079497858882 | |
trunk_oct 0.20737564004957676 | |
trunk 0.22116354294121265 | |
trunk 0.21869436744600534 | |
trunk 0.22755639161914587 | |
trunk 0.21909922547638416 | |
trunk 0.2188980421051383 | |
modified 0.21806801576167345 | |
modified 0.23552309162914753 | |
modified 0.2178712347522378 | |
modified 0.22257215715944767 | |
modified 0.21878324821591377 | |
----------------------------------------------------------- | |
file_rename | |
# rename file | |
require 'tempfile' | |
max = 100_000 | |
tmp = [ Tempfile.new('rename-a'), Tempfile.new('rename-b') ] | |
a, b = tmp.map { |x| x.path } | |
max.times do | |
File.rename(a, b) | |
File.rename(b, a) | |
end | |
tmp.each { |t| t.close! } | |
ruby_2_4 0.6642924919724464 | |
ruby_2_4 0.6502274638041854 | |
ruby_2_4 0.6562406495213509 | |
ruby_2_4 0.6850288612768054 | |
ruby_2_4 0.6594824707135558 | |
trunk_oct 0.6670955242589116 | |
trunk_oct 0.6725148819386959 | |
trunk_oct 0.664207162335515 | |
trunk_oct 0.6652930174022913 | |
trunk_oct 0.6675800252705812 | |
trunk 0.6808162312954664 | |
trunk 0.68763168156147 | |
trunk 0.6752430256456137 | |
trunk 0.6801165351644158 | |
trunk 0.6752310367301106 | |
modified 0.6756181111559272 | |
modified 0.6772550158202648 | |
modified 0.6776238521561027 | |
modified 0.6753160459920764 | |
modified 0.6779537666589022 | |
----------------------------------------------------------- | |
hash_aref_dsym | |
h = {} | |
syms = ('a'..'z').map { |s| s.to_sym } | |
syms.each { |s| h[s] = 1 } | |
200_000.times { syms.each { |s| h[s] } } | |
ruby_2_4 0.263726475648582 | |
ruby_2_4 0.2761738272383809 | |
ruby_2_4 0.2723959432914853 | |
ruby_2_4 0.26847472228109837 | |
ruby_2_4 0.2680125245824456 | |
trunk_oct 0.2943550646305084 | |
trunk_oct 0.2937017111107707 | |
trunk_oct 0.29192993324249983 | |
trunk_oct 0.2919363062828779 | |
trunk_oct 0.30135550256818533 | |
trunk 0.3101480947807431 | |
trunk 0.314423693343997 | |
trunk 0.31170643866062164 | |
trunk 0.3108241092413664 | |
trunk 0.30914205592125654 | |
modified 0.30534568428993225 | |
modified 0.30895554553717375 | |
modified 0.31122990790754557 | |
modified 0.3072431115433574 | |
modified 0.33601050078868866 | |
----------------------------------------------------------- | |
hash_aref_dsym_long | |
# [ruby-core:70129] [Bug #11396] | |
collection_size = 200000 | |
sample_size = 10000 | |
values = (1..collection_size).to_a.map do |x| | |
"THIS IS A LONGER STRING THAT IS ALSO UNIQUE #{x}" | |
end | |
symbol_hash = {} | |
values.each do |x| | |
symbol_hash[x.to_sym] = 1 | |
end | |
# use the same samples each time to minimize deviations | |
rng = Random.new(0) | |
symbol_sample_array = values.sample(sample_size, random: rng).map(&:to_sym) | |
3000.times do | |
symbol_sample_array.each { |x| symbol_hash[x] } | |
end | |
ruby_2_4 3.175567743368447 | |
ruby_2_4 3.206102818250656 | |
ruby_2_4 3.2415223885327578 | |
ruby_2_4 3.299550731666386 | |
ruby_2_4 3.311943086795509 | |
trunk_oct 3.237652954645455 | |
trunk_oct 3.0586729859933257 | |
trunk_oct 3.3109343741089106 | |
trunk_oct 3.3957728538662195 | |
trunk_oct 3.459920813329518 | |
trunk 3.164889508858323 | |
trunk 3.1942493384703994 | |
trunk 3.189624813385308 | |
trunk 3.1740572210401297 | |
trunk 3.2820500675588846 | |
modified 3.1559967659413815 | |
modified 3.197402344085276 | |
modified 3.2052777437493205 | |
modified 3.282293534837663 | |
modified 3.3287694938480854 | |
----------------------------------------------------------- | |
hash_aref_fix | |
h = {} | |
nums = (1..26).to_a | |
nums.each { |i| h[i] = i } | |
200_000.times { nums.each { |s| h[s] } } | |
ruby_2_4 0.2609948040917516 | |
ruby_2_4 0.2578913839533925 | |
ruby_2_4 0.25224294513463974 | |
ruby_2_4 0.271748811006546 | |
ruby_2_4 0.27248279098421335 | |
trunk_oct 0.29355032555758953 | |
trunk_oct 0.28349983040243387 | |
trunk_oct 0.2936028419062495 | |
trunk_oct 0.3452490037307143 | |
trunk_oct 0.41720787063241005 | |
trunk 0.3100457526743412 | |
trunk 0.2910926891490817 | |
trunk 0.29295599088072777 | |
trunk 0.41942670848220587 | |
trunk 0.2960450313985348 | |
modified 0.2895897263661027 | |
modified 0.27915025781840086 | |
modified 0.2791378078982234 | |
modified 0.2965983608737588 | |
modified 0.28458560444414616 | |
----------------------------------------------------------- | |
hash_aref_flo | |
h = {} | |
strs = [*1..10000].map! {|i| i.fdiv(10)} | |
strs.each { |s| h[s] = s } | |
50.times { strs.each { |s| h[s] } } | |
ruby_2_4 0.0499512767419219 | |
ruby_2_4 0.051750097423791885 | |
ruby_2_4 0.05015122704207897 | |
ruby_2_4 0.04933540336787701 | |
ruby_2_4 0.04952178802341223 | |
trunk_oct 0.05952627211809158 | |
trunk_oct 0.059625888243317604 | |
trunk_oct 0.059829698875546455 | |
trunk_oct 0.060849291272461414 | |
trunk_oct 0.05933453608304262 | |
trunk 0.06063990853726864 | |
trunk 0.060607340186834335 | |
trunk 0.060403233394026756 | |
trunk 0.0609989445656538 | |
trunk 0.06045036483556032 | |
modified 0.062234902754426 | |
modified 0.06396108586341143 | |
modified 0.0621397802606225 | |
modified 0.0630847280845046 | |
modified 0.062187787145376205 | |
----------------------------------------------------------- | |
hash_aref_miss | |
h = {} | |
strs = ('a'..'z').to_a.map!(&:freeze) | |
strs.each { |s| h[s] = s } | |
strs = ('A'..'Z').to_a | |
200_000.times { strs.each { |s| h[s] } } | |
ruby_2_4 0.3686364060267806 | |
ruby_2_4 0.37831310741603374 | |
ruby_2_4 0.3779862029477954 | |
ruby_2_4 0.3743992382660508 | |
ruby_2_4 0.361598146148026 | |
trunk_oct 0.38061713334172964 | |
trunk_oct 0.3909873841330409 | |
trunk_oct 0.395187652669847 | |
trunk_oct 0.3763585928827524 | |
trunk_oct 0.3905332116410136 | |
trunk 0.39660962857306004 | |
trunk 0.3936945628374815 | |
trunk 0.4377703182399273 | |
trunk 0.40676034800708294 | |
trunk 0.36866373661905527 | |
modified 0.39652410615235567 | |
modified 0.3937609801068902 | |
modified 0.40038585383445024 | |
modified 0.3890699865296483 | |
modified 0.400178880430758 | |
----------------------------------------------------------- | |
hash_aref_str | |
h = {} | |
strs = ('a'..'z').to_a.map!(&:freeze) | |
strs.each { |s| h[s] = s } | |
200_000.times { strs.each { |s| h[s] } } | |
ruby_2_4 0.3430917225778103 | |
ruby_2_4 0.32951133884489536 | |
ruby_2_4 0.33487503230571747 | |
ruby_2_4 0.3384719081223011 | |
ruby_2_4 0.33576900139451027 | |
trunk_oct 0.34187883976846933 | |
trunk_oct 0.34241723641753197 | |
trunk_oct 0.34056114312261343 | |
trunk_oct 0.35416494961827993 | |
trunk_oct 0.35687818843871355 | |
trunk 0.3454119525849819 | |
trunk 0.34791990276426077 | |
trunk 0.35336306039243937 | |
trunk 0.35420312639325857 | |
trunk 0.34874989464879036 | |
modified 0.3405866641551256 | |
modified 0.34616814460605383 | |
modified 0.32941246312111616 | |
modified 0.3446532553061843 | |
modified 0.3441737936809659 | |
----------------------------------------------------------- | |
hash_aref_sym | |
h = {} | |
syms = ('a'..'z').to_a | |
begin | |
syms = eval("%i[#{syms.join(' ')}]") | |
rescue SyntaxError # <= 1.9.3 | |
syms.map!(&:to_sym) | |
end | |
syms.each { |s| h[s] = s } | |
200_000.times { syms.each { |s| h[s] } } | |
ruby_2_4 0.2723753023892641 | |
ruby_2_4 0.26579560339450836 | |
ruby_2_4 0.2653283290565014 | |
ruby_2_4 0.27019786927849054 | |
ruby_2_4 0.285128521732986 | |
trunk_oct 0.3119408180937171 | |
trunk_oct 0.29992883652448654 | |
trunk_oct 0.29907585494220257 | |
trunk_oct 0.3094273768365383 | |
trunk_oct 0.30554392095655203 | |
trunk 0.3042509751394391 | |
trunk 0.30037481151521206 | |
trunk 0.3012241991236806 | |
trunk 0.29844539798796177 | |
trunk 0.30931904818862677 | |
modified 0.3019282864406705 | |
modified 0.32146325148642063 | |
modified 0.2996023017913103 | |
modified 0.3141472479328513 | |
modified 0.2989084841683507 | |
----------------------------------------------------------- | |
hash_aref_sym_long | |
h = {} | |
syms = %w[puts warn syswrite write stat bacon lettuce tomato | |
some symbols in this array may already be interned others should not be | |
hash browns make good breakfast but not cooked using prime numbers | |
shift for division entries delete_if keys exist? | |
] | |
begin | |
syms = eval("%i[#{syms.join(' ')}]") | |
rescue SyntaxError # <= 1.9.3 | |
syms.map!(&:to_sym) | |
end | |
syms.each { |s| h[s] = s } | |
200_000.times { syms.each { |s| h[s] } } | |
ruby_2_4 0.3622218491509557 | |
ruby_2_4 0.4381094928830862 | |
ruby_2_4 0.3674069354310632 | |
ruby_2_4 0.3799957800656557 | |
ruby_2_4 0.3875621594488621 | |
trunk_oct 0.44223527424037457 | |
trunk_oct 0.42702542897313833 | |
trunk_oct 0.4132824158295989 | |
trunk_oct 0.41335222963243723 | |
trunk_oct 0.42288501653820276 | |
trunk 0.4240665137767792 | |
trunk 0.4099509548395872 | |
trunk 0.41233318485319614 | |
trunk 0.4047677731141448 | |
trunk 0.41507475171238184 | |
modified 0.40376974642276764 | |
modified 0.407093895599246 | |
modified 0.40305578522384167 | |
modified 0.42089630104601383 | |
modified 0.4092823453247547 | |
----------------------------------------------------------- | |
hash_flatten | |
h = {} | |
10000.times do |i| | |
h[i] = nil | |
end | |
1000.times do | |
h.flatten | |
end | |
ruby_2_4 0.23931661248207092 | |
ruby_2_4 0.23898044601082802 | |
ruby_2_4 0.2388934502378106 | |
ruby_2_4 0.2389828274026513 | |
ruby_2_4 0.23898828402161598 | |
trunk_oct 0.18286235444247723 | |
trunk_oct 0.18168202694505453 | |
trunk_oct 0.18208450730890036 | |
trunk_oct 0.18146330770105124 | |
trunk_oct 0.18216758500784636 | |
trunk 0.20638114120811224 | |
trunk 0.20617200154811144 | |
trunk 0.20668425224721432 | |
trunk 0.20664830226451159 | |
trunk 0.20640033297240734 | |
modified 0.18963987659662962 | |
modified 0.18995442241430283 | |
modified 0.1893994454294443 | |
modified 0.1897573471069336 | |
modified 0.1897696079686284 | |
----------------------------------------------------------- | |
hash_ident_flo | |
h = {}.compare_by_identity | |
strs = (1..10000).to_a.map!(&:to_f) | |
strs.each { |s| h[s] = s } | |
50.times { strs.each { |s| h[s] } } | |
ruby_2_4 0.04909050464630127 | |
ruby_2_4 0.04922498110681772 | |
ruby_2_4 0.04883077833801508 | |
ruby_2_4 0.0491654546931386 | |
ruby_2_4 0.04862384870648384 | |
trunk_oct 0.05925955902785063 | |
trunk_oct 0.05936989467591047 | |
trunk_oct 0.059128270484507084 | |
trunk_oct 0.05897417291998863 | |
trunk_oct 0.059846263378858566 | |
trunk 0.06017099879682064 | |
trunk 0.0599897475913167 | |
trunk 0.060129120014607906 | |
trunk 0.059829612262547016 | |
trunk 0.059953819029033184 | |
modified 0.06197364069521427 | |
modified 0.06301239226013422 | |
modified 0.06195529829710722 | |
modified 0.06145096942782402 | |
modified 0.06151615083217621 | |
----------------------------------------------------------- | |
hash_ident_num | |
h = {}.compare_by_identity | |
nums = (1..26).to_a | |
nums.each { |n| h[n] = n } | |
200_000.times { nums.each { |n| h[n] } } | |
ruby_2_4 0.2550027072429657 | |
ruby_2_4 0.25709130242466927 | |
ruby_2_4 0.2795975673943758 | |
ruby_2_4 0.28014630638062954 | |
ruby_2_4 0.2746730362996459 | |
trunk_oct 0.30431725084781647 | |
trunk_oct 0.27907548658549786 | |
trunk_oct 0.3097229143604636 | |
trunk_oct 0.28085173200815916 | |
trunk_oct 0.2814785363152623 | |
trunk 0.30336756259202957 | |
trunk 0.2823643572628498 | |
trunk 0.3062245165929198 | |
trunk 0.3192725069820881 | |
trunk 0.28318785782903433 | |
modified 0.34642425179481506 | |
modified 0.29638210218399763 | |
modified 0.2898220447823405 | |
modified 0.29221873730421066 | |
modified 0.3005418302491307 | |
----------------------------------------------------------- | |
hash_ident_obj | |
h = {}.compare_by_identity | |
objs = 26.times.map { Object.new } | |
objs.each { |o| h[o] = o } | |
200_000.times { objs.each { |o| h[o] } } | |
ruby_2_4 0.2589333523064852 | |
ruby_2_4 0.2724173329770565 | |
ruby_2_4 0.2794358851388097 | |
ruby_2_4 0.26604977436363697 | |
ruby_2_4 0.25615649949759245 | |
trunk_oct 0.28422093857079744 | |
trunk_oct 0.29160023387521505 | |
trunk_oct 0.2841336829587817 | |
trunk_oct 0.29316555336117744 | |
trunk_oct 0.29831799305975437 | |
trunk 0.2968236692249775 | |
trunk 0.3070484884083271 | |
trunk 0.29577150382101536 | |
trunk 0.2952602840960026 | |
trunk 0.2905656127259135 | |
modified 0.2833299096673727 | |
modified 0.3000877173617482 | |
modified 0.30436465982347727 | |
modified 0.29478229861706495 | |
modified 0.296668728813529 | |
----------------------------------------------------------- | |
hash_ident_str | |
h = {}.compare_by_identity | |
strs = ('a'..'z').to_a | |
strs.each { |s| h[s] = s } | |
200_000.times { strs.each { |s| h[s] } } | |
ruby_2_4 0.28064961079508066 | |
ruby_2_4 0.2699139639735222 | |
ruby_2_4 0.2610522909089923 | |
ruby_2_4 0.259786419570446 | |
ruby_2_4 0.2636388372629881 | |
trunk_oct 0.289898619055748 | |
trunk_oct 0.27941754274070263 | |
trunk_oct 0.2989111291244626 | |
trunk_oct 0.30557968094944954 | |
trunk_oct 0.3044827217236161 | |
trunk 0.2841451307758689 | |
trunk 0.29513147193938494 | |
trunk 0.29825274739414454 | |
trunk 0.3008001418784261 | |
trunk 0.29079663939774036 | |
modified 0.2829178422689438 | |
modified 0.2951761847361922 | |
modified 0.29073284193873405 | |
modified 0.2812343193218112 | |
modified 0.2890197755768895 | |
----------------------------------------------------------- | |
hash_ident_sym | |
h = {}.compare_by_identity | |
syms = ('a'..'z').to_a.map(&:to_sym) | |
syms.each { |s| h[s] = s } | |
200_000.times { syms.each { |s| h[s] } } | |
ruby_2_4 0.26749170385301113 | |
ruby_2_4 0.25853430200368166 | |
ruby_2_4 0.26072264928370714 | |
ruby_2_4 0.25702809914946556 | |
ruby_2_4 0.27116471622139215 | |
trunk_oct 0.3072659121826291 | |
trunk_oct 0.30654087476432323 | |
trunk_oct 0.3076043529435992 | |
trunk_oct 0.2920140326023102 | |
trunk_oct 0.31216693948954344 | |
trunk 0.30231455527246 | |
trunk 0.3066350994631648 | |
trunk 0.29409283585846424 | |
trunk 0.3120587505400181 | |
trunk 0.30041169468313456 | |
modified 0.2973363669589162 | |
modified 0.3094587540253997 | |
modified 0.3012598352506757 | |
modified 0.3460267363116145 | |
modified 0.2915645893663168 | |
----------------------------------------------------------- | |
hash_keys | |
h = {} | |
10000.times do |i| | |
h[i] = nil | |
end | |
5000.times do | |
h.keys | |
end | |
ruby_2_4 0.09465214144438505 | |
ruby_2_4 0.09494761656969786 | |
ruby_2_4 0.09517013281583786 | |
ruby_2_4 0.09517311304807663 | |
ruby_2_4 0.09566901158541441 | |
trunk_oct 0.10243359114974737 | |
trunk_oct 0.10314598213881254 | |
trunk_oct 0.1023942157626152 | |
trunk_oct 0.10257727932184935 | |
trunk_oct 0.10197165608406067 | |
trunk 0.1065923161804676 | |
trunk 0.1063461247831583 | |
trunk 0.10021214559674263 | |
trunk 0.10675222054123878 | |
trunk 0.1004721550270915 | |
modified 0.10937212035059929 | |
modified 0.10857798904180527 | |
modified 0.10883629694581032 | |
modified 0.10871011950075626 | |
modified 0.10857814364135265 | |
----------------------------------------------------------- | |
hash_long | |
k1 = "Ping Pong Ping Pong Ping Pong Ping Pong Ping Pong Ping Pong Ping Pong Ping Pong Ping Pong Ping Pong"; | |
k2 = "Pong Ping Pong Ping Pong Ping Pong Ping Pong Ping Pong Ping Pong Ping Pong Ping Pong Ping Pong Ping"; | |
h = {k1 => 0, k2 => 0}; | |
3000000.times{|i| k = i % 2 ? k2 : k1; h [k] = h[k] + 1} | |
ruby_2_4 0.6776566496118903 | |
ruby_2_4 0.6738138990476727 | |
ruby_2_4 0.6687519643455744 | |
ruby_2_4 0.6694637639448047 | |
ruby_2_4 0.6692806025967002 | |
trunk_oct 0.576607920229435 | |
trunk_oct 0.583100532181561 | |
trunk_oct 0.5810478115454316 | |
trunk_oct 0.5759585332125425 | |
trunk_oct 0.5758388945832849 | |
trunk 0.5886679319664836 | |
trunk 0.578824719414115 | |
trunk 0.5794282341375947 | |
trunk 0.5891964696347713 | |
trunk 0.5801844587549567 | |
modified 0.5787801658734679 | |
modified 0.5786007614806294 | |
modified 0.5786173976957798 | |
modified 0.5787396812811494 | |
modified 0.5783470449969172 | |
----------------------------------------------------------- | |
hash_shift | |
h = {} | |
10000.times do |i| | |
h[i] = nil | |
end | |
50000.times do | |
k, v = h.shift | |
h[k] = v | |
end | |
ruby_2_4 0.029302826151251793 | |
ruby_2_4 0.02946515940129757 | |
ruby_2_4 0.02928383182734251 | |
ruby_2_4 0.029138588346540928 | |
ruby_2_4 0.02953410241752863 | |
trunk_oct 0.03826920222491026 | |
trunk_oct 0.038040789775550365 | |
trunk_oct 0.03791420720517635 | |
trunk_oct 0.03813316021114588 | |
trunk_oct 0.03833345044404268 | |
trunk 0.0393370445817709 | |
trunk 0.0394512414932251 | |
trunk 0.03941994905471802 | |
trunk 0.039190332405269146 | |
trunk 0.03947609290480614 | |
modified 0.04173279367387295 | |
modified 0.04142030142247677 | |
modified 0.0414245929569006 | |
modified 0.041482603177428246 | |
modified 0.04123121686279774 | |
----------------------------------------------------------- | |
hash_shift_u16 | |
h = {} | |
(16384..65536).each do |i| | |
h[i] = nil | |
end | |
300000.times do | |
k, v = h.shift | |
h[k] = v | |
end | |
ruby_2_4 0.06899990793317556 | |
ruby_2_4 0.06721921171993017 | |
ruby_2_4 0.0671424102038145 | |
ruby_2_4 0.06842063087970018 | |
ruby_2_4 0.06798364501446486 | |
trunk_oct 0.0758235789835453 | |
trunk_oct 0.07667972147464752 | |
trunk_oct 0.07573583722114563 | |
trunk_oct 0.07633332069963217 | |
trunk_oct 0.0763377146795392 | |
trunk 0.07831694092601538 | |
trunk 0.07861876394599676 | |
trunk 0.07803748268634081 | |
trunk 0.07770607620477676 | |
trunk 0.07872064877301455 | |
modified 0.07910268101841211 | |
modified 0.08106855396181345 | |
modified 0.07938780821859837 | |
modified 0.07960688043385744 | |
modified 0.07941157557070255 | |
----------------------------------------------------------- | |
hash_shift_u24 | |
h = {} | |
(0xff4000..0xffffff).each do |i| | |
h[i] = nil | |
end | |
300000.times do | |
k, v = h.shift | |
h[k] = v | |
end | |
ruby_2_4 0.06821257993578911 | |
ruby_2_4 0.06714130844920874 | |
ruby_2_4 0.06836456805467606 | |
ruby_2_4 0.06916996371001005 | |
ruby_2_4 0.06688732840120792 | |
trunk_oct 0.07595515623688698 | |
trunk_oct 0.07614211458712816 | |
trunk_oct 0.0766504593193531 | |
trunk_oct 0.07583861239254475 | |
trunk_oct 0.07618055399507284 | |
trunk 0.07757530827075243 | |
trunk 0.07761591114103794 | |
trunk 0.07828425709158182 | |
trunk 0.07989687751978636 | |
trunk 0.07830884121358395 | |
modified 0.07936799339950085 | |
modified 0.08005461096763611 | |
modified 0.08000997081398964 | |
modified 0.07990794256329536 | |
modified 0.07945192977786064 | |
----------------------------------------------------------- | |
hash_shift_u32 | |
h = {} | |
(0xffff4000..0xffffffff).each do |i| | |
h[i] = nil | |
end | |
300000.times do | |
k, v = h.shift | |
h[k] = v | |
end | |
ruby_2_4 0.0692470520734787 | |
ruby_2_4 0.06743897125124931 | |
ruby_2_4 0.06738287396728992 | |
ruby_2_4 0.06708309706300497 | |
ruby_2_4 0.06774392630904913 | |
trunk_oct 0.07641611527651548 | |
trunk_oct 0.07598584052175283 | |
trunk_oct 0.07606874126940966 | |
trunk_oct 0.07611617632210255 | |
trunk_oct 0.07661638222634792 | |
trunk 0.0782409030944109 | |
trunk 0.07836768310517073 | |
trunk 0.07830094452947378 | |
trunk 0.07797120045870543 | |
trunk 0.0782504640519619 | |
modified 0.07922205608338118 | |
modified 0.07980144582688808 | |
modified 0.07950060721486807 | |
modified 0.08021101914346218 | |
modified 0.07971761748194695 | |
----------------------------------------------------------- | |
hash_small2 | |
1000000.times.map{|i| a={}; 2.times{|j| a[j]=j}; a} | |
ruby_2_4 0.4494409402832389 | |
ruby_2_4 0.4508389215916395 | |
ruby_2_4 0.451890891417861 | |
ruby_2_4 0.45400820206850767 | |
ruby_2_4 0.45705028530210257 | |
trunk_oct 0.4623531950637698 | |
trunk_oct 0.4621663298457861 | |
trunk_oct 0.46354869566857815 | |
trunk_oct 0.46262427791953087 | |
trunk_oct 0.46277075447142124 | |
trunk 0.48058672808110714 | |
trunk 0.47581950295716524 | |
trunk 0.4770717294886708 | |
trunk 0.4768876023590565 | |
trunk 0.47570366598665714 | |
modified 0.4747159481048584 | |
modified 0.47542138025164604 | |
modified 0.48115441482514143 | |
modified 0.47522070351988077 | |
modified 0.47443811874836683 | |
----------------------------------------------------------- | |
hash_small4 | |
1000000.times.map{|i| a={}; 4.times{|j| a[j]=j}; a} | |
ruby_2_4 0.5742486761882901 | |
ruby_2_4 0.5974699202924967 | |
ruby_2_4 0.5767933959141374 | |
ruby_2_4 0.5782211907207966 | |
ruby_2_4 0.5712182810530066 | |
trunk_oct 0.5861901910975575 | |
trunk_oct 0.5861655008047819 | |
trunk_oct 0.5861290348693728 | |
trunk_oct 0.6346785500645638 | |
trunk_oct 0.5867755152285099 | |
trunk 0.6085033426061273 | |
trunk 0.6072090184316039 | |
trunk 0.6069953348487616 | |
trunk 0.6076025785878301 | |
trunk 0.6087436396628618 | |
modified 0.6034981710836291 | |
modified 0.604193969629705 | |
modified 0.6024577636271715 | |
modified 0.604750245809555 | |
modified 0.6031058877706528 | |
----------------------------------------------------------- | |
hash_small8 | |
1000000.times.map{|i| a={}; 8.times{|j| a[j]=j}; a} | |
ruby_2_4 1.0295241875573993 | |
ruby_2_4 1.1690709693357348 | |
ruby_2_4 1.0750119490548968 | |
ruby_2_4 1.0536391269415617 | |
ruby_2_4 1.0349234230816364 | |
trunk_oct 1.058202332817018 | |
trunk_oct 1.0488654309883714 | |
trunk_oct 1.0568763576447964 | |
trunk_oct 1.0487769413739443 | |
trunk_oct 1.047456793487072 | |
trunk 1.235707575455308 | |
trunk 1.1773730088025331 | |
trunk 1.181349717080593 | |
trunk 1.239696185104549 | |
trunk 1.1787792230024934 | |
modified 1.0944882482290268 | |
modified 1.091933854855597 | |
modified 1.0930390488356352 | |
modified 1.0945343114435673 | |
modified 1.0924241999164224 | |
----------------------------------------------------------- | |
hash_to_proc | |
h = {} | |
10000.times do |i| | |
h[i] = nil | |
end | |
5000.times do |i| | |
[i].map(&h) | |
end | |
ruby_2_4 0.024416503496468067 | |
ruby_2_4 0.024257753044366837 | |
ruby_2_4 0.024156589061021805 | |
ruby_2_4 0.0242291409522295 | |
ruby_2_4 0.024087593890726566 | |
trunk_oct 0.03295538853853941 | |
trunk_oct 0.033053671941161156 | |
trunk_oct 0.03301873616874218 | |
trunk_oct 0.03271505702286959 | |
trunk_oct 0.03284402284771204 | |
trunk 0.033997722901403904 | |
trunk 0.03410301823168993 | |
trunk 0.033932266756892204 | |
trunk 0.03396750520914793 | |
trunk 0.03401686251163483 | |
modified 0.03639744780957699 | |
modified 0.03635264374315739 | |
modified 0.036440882831811905 | |
modified 0.03617205750197172 | |
modified 0.03621793072670698 | |
----------------------------------------------------------- | |
hash_values | |
h = {} | |
10000.times do |i| | |
h[i] = nil | |
end | |
5000.times do | |
h.values | |
end | |
ruby_2_4 0.09482246823608875 | |
ruby_2_4 0.0951392687857151 | |
ruby_2_4 0.09502425231039524 | |
ruby_2_4 0.095138237811625 | |
ruby_2_4 0.09573106747120619 | |
trunk_oct 0.10253547970205545 | |
trunk_oct 0.10209653619676828 | |
trunk_oct 0.10230094008147717 | |
trunk_oct 0.10225026402622461 | |
trunk_oct 0.10090127028524876 | |
trunk 0.1004562433809042 | |
trunk 0.1064581610262394 | |
trunk 0.10636940412223339 | |
trunk 0.10040752310305834 | |
trunk 0.1064596688374877 | |
modified 0.1088621262460947 | |
modified 0.10968368221074343 | |
modified 0.10879790503531694 | |
modified 0.10862477961927652 | |
modified 0.1090538464486599 | |
----------------------------------------------------------- | |
int_quo | |
5000000.times { 42.quo(3) } | |
ruby_2_4 1.7910891138017178 | |
ruby_2_4 1.7285595210269094 | |
ruby_2_4 1.7591103501617908 | |
ruby_2_4 1.7299061687663198 | |
ruby_2_4 1.775772562250495 | |
trunk_oct 0.9134138859808445 | |
trunk_oct 0.9059665594249964 | |
trunk_oct 0.9056594418361783 | |
trunk_oct 0.9054229985922575 | |
trunk_oct 0.928419372998178 | |
trunk 0.9065565336495638 | |
trunk 0.905972296372056 | |
trunk 0.8987451354041696 | |
trunk 0.919618234038353 | |
trunk 0.8996790926903486 | |
modified 0.9016909934580326 | |
modified 0.9023942472413182 | |
modified 0.9089935682713985 | |
modified 0.90226483438164 | |
modified 0.9030623137950897 | |
----------------------------------------------------------- | |
io_copy_stream_write | |
# The goal of this is to use a synthetic (non-IO) reader | |
# to trigger the read/write loop of IO.copy_stream, | |
# bypassing in-kernel mechanisms like sendfile for zero copy, | |
# so we wrap the /dev/zero IO object: | |
class Zero | |
def initialize | |
@n = 100000 | |
@in = File.open('/dev/zero', 'rb') | |
end | |
def read(len, buf) | |
return if (@n -= 1) == 0 | |
@in.read(len, buf) | |
end | |
end | |
begin | |
src = Zero.new | |
dst = File.open(IO::NULL, 'wb') | |
n = IO.copy_stream(src, dst) | |
rescue Errno::ENOENT | |
# not *nix | |
end if IO.respond_to?(:copy_stream) && IO.const_defined?(:NULL) | |
ruby_2_4 0.16210402268916368 | |
ruby_2_4 0.16486232168972492 | |
ruby_2_4 0.16260320134460926 | |
ruby_2_4 0.1673704106360674 | |
ruby_2_4 0.16285186167806387 | |
trunk_oct 0.16517131309956312 | |
trunk_oct 0.16473023127764463 | |
trunk_oct 0.16761245392262936 | |
trunk_oct 0.16392066795378923 | |
trunk_oct 0.1653193812817335 | |
trunk 0.16689542774111032 | |
trunk 0.1713306289166212 | |
trunk 0.16785669792443514 | |
trunk 0.1687092548236251 | |
trunk 0.17021904978901148 | |
modified 0.1704663671553135 | |
modified 0.17199433408677578 | |
modified 0.16818094532936811 | |
modified 0.1791617888957262 | |
modified 0.17123859841376543 | |
----------------------------------------------------------- | |
io_copy_stream_write_socket | |
# The goal of this is to use a synthetic (non-IO) reader | |
# to trigger the read/write loop of IO.copy_stream, | |
# bypassing in-kernel mechanisms like sendfile for zero copy, | |
# so we wrap the /dev/zero IO object: | |
class Zero | |
def initialize | |
@n = 100000 | |
@in = File.open('/dev/zero', 'rb') | |
end | |
def read(len, buf) | |
return if (@n -= 1) == 0 | |
@in.read(len, buf) | |
end | |
end | |
begin | |
require 'socket' | |
src = Zero.new | |
rd, wr = UNIXSocket.pair | |
pid = fork do | |
wr.close | |
buf = String.new | |
while rd.read(16384, buf) | |
end | |
end | |
rd.close | |
IO.copy_stream(src, wr) | |
rescue Errno::ENOENT, NotImplementedError, NameError | |
# not *nix: missing /dev/zero, fork, or UNIXSocket | |
rescue LoadError # no socket? | |
ensure | |
wr.close if wr | |
Process.waitpid(pid) if pid | |
end if IO.respond_to?(:copy_stream) | |
ruby_2_4 0.3203147491440177 | |
ruby_2_4 0.3256166009232402 | |
ruby_2_4 0.31645045056939125 | |
ruby_2_4 0.3181094489991665 | |
ruby_2_4 0.3224779777228832 | |
trunk_oct 0.32048323657363653 | |
trunk_oct 0.333693141117692 | |
trunk_oct 0.32401488348841667 | |
trunk_oct 0.336939106695354 | |
trunk_oct 0.4383966764435172 | |
trunk 0.3204655172303319 | |
trunk 0.3223985591903329 | |
trunk 0.3596854144707322 | |
trunk 0.3231933154165745 | |
trunk 0.32139942422509193 | |
modified 0.3314205938950181 | |
modified 0.33042685873806477 | |
modified 0.32387255039066076 | |
modified 0.32587605249136686 | |
modified 0.33207847736775875 | |
----------------------------------------------------------- | |
io_file_create | |
# | |
# Create files | |
# | |
max = 200_000 | |
file = './tmpfile_of_bm_io_file_create' | |
max.times{ | |
f = open(file, 'w') | |
f.close#(true) | |
} | |
File.unlink(file) | |
ruby_2_4 0.7999052871018648 | |
ruby_2_4 0.7802762482315302 | |
ruby_2_4 0.7981305615976453 | |
ruby_2_4 0.8176641836762428 | |
ruby_2_4 0.7996335029602051 | |
trunk_oct 0.8188932035118341 | |
trunk_oct 0.8183162622153759 | |
trunk_oct 0.8078320994973183 | |
trunk_oct 0.8258823677897453 | |
trunk_oct 0.8580632116645575 | |
trunk 0.7810021582990885 | |
trunk 0.8000286109745502 | |
trunk 0.8005015533417463 | |
trunk 0.7879576412960887 | |
trunk 0.7909177830442786 | |
modified 0.8119170628488064 | |
modified 0.7866885531693697 | |
modified 0.7928201509639621 | |
modified 0.8005136391147971 | |
modified 0.8375968812033534 | |
----------------------------------------------------------- | |
io_file_read | |
# | |
# Seek and Read file. | |
# | |
require 'tempfile' | |
max = 200_000 | |
str = "Hello world! " * 1000 | |
f = Tempfile.new('yarv-benchmark') | |
f.write str | |
max.times{ | |
f.seek 0 | |
f.read | |
} | |
ruby_2_4 0.8217237209901214 | |
ruby_2_4 0.8444003714248538 | |
ruby_2_4 0.8303785212337971 | |
ruby_2_4 0.8469831356778741 | |
ruby_2_4 0.8294633002951741 | |
trunk_oct 0.7688569575548172 | |
trunk_oct 0.7721415897831321 | |
trunk_oct 0.8051110897213221 | |
trunk_oct 0.7887211926281452 | |
trunk_oct 0.8064563442021608 | |
trunk 0.7544424263760448 | |
trunk 0.7700773729011416 | |
trunk 0.7584051731973886 | |
trunk 0.7609825311228633 | |
trunk 0.7656487720087171 | |
modified 0.7598473494872451 | |
modified 0.7565656080842018 | |
modified 0.8026420054957271 | |
modified 0.755095761269331 | |
modified 0.7528132116422057 | |
----------------------------------------------------------- | |
io_file_write | |
# | |
# Seek and Write file. | |
# | |
require 'tempfile' | |
max = 200_000 | |
str = "Hello world! " * 1000 | |
f = Tempfile.new('yarv-benchmark') | |
max.times{ | |
f.seek 0 | |
f.write str | |
} | |
ruby_2_4 0.5772966332733631 | |
ruby_2_4 0.5744149908423424 | |
ruby_2_4 0.5781210800632834 | |
ruby_2_4 0.577535237185657 | |
ruby_2_4 0.595387808047235 | |
trunk_oct 0.585019969381392 | |
trunk_oct 0.5834510438144207 | |
trunk_oct 0.5755818607285619 | |
trunk_oct 0.5747231030836701 | |
trunk_oct 0.5832370640709996 | |
trunk 0.5774798141792417 | |
trunk 0.5735156740993261 | |
trunk 0.5775971859693527 | |
trunk 0.5818069921806455 | |
trunk 0.5767041118815541 | |
modified 0.5714107882231474 | |
modified 0.5819572256878018 | |
modified 0.5726626105606556 | |
modified 0.5816189525648952 | |
modified 0.5776834171265364 | |
----------------------------------------------------------- | |
io_nonblock_noex | |
nr = 1_000_000 | |
i = 0 | |
msg = '.' | |
buf = '.' | |
noex = { exception: false } | |
begin | |
r, w = IO.pipe | |
while i < nr | |
i += 1 | |
w.write_nonblock(msg, noex) | |
r.read_nonblock(1, buf, noex) | |
end | |
rescue ArgumentError # old Rubies | |
while i < nr | |
i += 1 | |
w.write_nonblock(msg) | |
r.read_nonblock(1, buf) | |
end | |
ensure | |
r.close | |
w.close | |
end | |
ruby_2_4 1.351217346265912 | |
ruby_2_4 1.3710231287404895 | |
ruby_2_4 1.4210442770272493 | |
ruby_2_4 1.339781346730888 | |
ruby_2_4 1.373001316562295 | |
trunk_oct 1.282431822270155 | |
trunk_oct 1.2943201018497348 | |
trunk_oct 1.2761540720239282 | |
trunk_oct 1.2877383586019278 | |
trunk_oct 1.300718992948532 | |
trunk 1.2950346199795604 | |
trunk 1.2903010724112391 | |
trunk 1.3431848688051105 | |
trunk 1.2978426683694124 | |
trunk 1.2955013345927 | |
modified 1.3379434710368514 | |
modified 1.3073850935325027 | |
modified 1.43139236420393 | |
modified 1.3297874238342047 | |
modified 1.3217193624004722 | |
----------------------------------------------------------- | |
io_nonblock_noex2 | |
nr = 1_000_000 | |
i = 0 | |
msg = '.' | |
buf = '.' | |
begin | |
r, w = IO.pipe | |
while i < nr | |
i += 1 | |
w.write_nonblock(msg, exception: false) | |
r.read_nonblock(1, buf, exception: false) | |
end | |
rescue ArgumentError # old Rubies | |
while i < nr | |
i += 1 | |
w.write_nonblock(msg) | |
r.read_nonblock(1, buf) | |
end | |
ensure | |
r.close | |
w.close | |
end | |
ruby_2_4 0.8324068998917937 | |
ruby_2_4 0.8314814483746886 | |
ruby_2_4 0.8269680328667164 | |
ruby_2_4 0.8316371915861964 | |
ruby_2_4 0.8199124159291387 | |
trunk_oct 0.8225545426830649 | |
trunk_oct 0.8366458108648658 | |
trunk_oct 0.8511283118277788 | |
trunk_oct 0.8294539796188474 | |
trunk_oct 0.8529512928798795 | |
trunk 0.8512865994125605 | |
trunk 0.8464699042961001 | |
trunk 0.8392754150554538 | |
trunk 0.8420780496671796 | |
trunk 0.8508471073582768 | |
modified 0.8645479064434767 | |
modified 0.8406872861087322 | |
modified 0.8594023119658232 | |
modified 0.8463565856218338 | |
modified 0.8332216292619705 | |
----------------------------------------------------------- | |
io_pipe_rw | |
# Measure uncontended GVL performance via read/write with 1:1 threading | |
# If we switch to M:N threading, this will benchmark something else... | |
r, w = IO.pipe | |
src = '0'.freeze | |
dst = String.new | |
i = 0 | |
while i < 1_000_000 | |
i += 1 | |
w.write(src) | |
r.read(1, dst) | |
end | |
w.close | |
r.close | |
ruby_2_4 0.7143390085548162 | |
ruby_2_4 0.7022978942841291 | |
ruby_2_4 0.7022813595831394 | |
ruby_2_4 0.7124151447787881 | |
ruby_2_4 0.7000056002289057 | |
trunk_oct 0.7139607220888138 | |
trunk_oct 0.710090241394937 | |
trunk_oct 0.7141006896272302 | |
trunk_oct 0.7125008162111044 | |
trunk_oct 0.7146924622356892 | |
trunk 0.7243178458884358 | |
trunk 0.7200548071414232 | |
trunk 0.7394839841872454 | |
trunk 0.7268596375361085 | |
trunk 0.7209014231339097 | |
modified 0.7262718323618174 | |
modified 0.7193344123661518 | |
modified 0.7222678856924176 | |
modified 0.7509619044139981 | |
modified 0.7261429792270064 | |
----------------------------------------------------------- | |
io_select | |
# IO.select performance | |
w = [ IO.pipe[1] ]; | |
nr = 1000000 | |
nr.times { | |
IO.select nil, w | |
} | |
ruby_2_4 0.9978612475097179 | |
ruby_2_4 0.9951350139454007 | |
ruby_2_4 0.9974106270819902 | |
ruby_2_4 0.9967657895758748 | |
ruby_2_4 1.0035944301635027 | |
trunk_oct 1.0107591282576323 | |
trunk_oct 1.0033363224938512 | |
trunk_oct 1.009982293471694 | |
trunk_oct 1.005640427581966 | |
trunk_oct 1.0018855407834053 | |
trunk 0.9936086991801858 | |
trunk 1.0324719995260239 | |
trunk 1.00522892922163 | |
trunk 1.020094777457416 | |
trunk 0.9990698415786028 | |
modified 1.0174420643597841 | |
modified 1.015567747876048 | |
modified 0.9971954477950931 | |
modified 1.00277444627136 | |
modified 1.026356372050941 | |
----------------------------------------------------------- | |
io_select2 | |
# IO.select performance. worst case of single fd. | |
ios = [] | |
nr = 1000000 | |
if defined?(Process::RLIMIT_NOFILE) | |
max = Process.getrlimit(Process::RLIMIT_NOFILE)[0] | |
else | |
max = 64 | |
end | |
puts "max fd: #{max} (results not apparent with <= 1024 max fd)" | |
((max / 2) - 10).times do | |
ios.concat IO.pipe | |
end | |
last = [ ios[-1] ] | |
puts "last IO: #{last[0].inspect}" | |
nr.times do | |
IO.select nil, last | |
end | |
ruby_2_4 1.2514165174216032 | |
ruby_2_4 1.2058365903794765 | |
ruby_2_4 1.2566699665039778 | |
ruby_2_4 1.2180656678974628 | |
ruby_2_4 1.2143642427399755 | |
trunk_oct 1.2226426051929593 | |
trunk_oct 1.2405806230381131 | |
trunk_oct 1.2254924103617668 | |
trunk_oct 1.2207012921571732 | |
trunk_oct 1.2302411468699574 | |
trunk 1.23319860547781 | |
trunk 1.2176413107663393 | |
trunk 1.2214890699833632 | |
trunk 1.242837361060083 | |
trunk 1.2556630987673998 | |
modified 1.2407134361565113 | |
modified 1.223868195898831 | |
modified 1.2421179804950953 | |
modified 1.2392476228997111 | |
modified 1.2411613631993532 | |
----------------------------------------------------------- | |
io_select3 | |
# IO.select performance. a lot of fd | |
ios = [] | |
nr = 100 | |
if defined?(Process::RLIMIT_NOFILE) | |
max = Process.getrlimit(Process::RLIMIT_NOFILE)[0] | |
else | |
max = 64 | |
end | |
puts "max fd: #{max} (results not apparent with <= 1024 max fd)" | |
(max - 10).times do | |
r, w = IO.pipe | |
r.close | |
ios.push w | |
end | |
nr.times do | |
IO.select nil, ios | |
end | |
ruby_2_4 0.12176590226590633 | |
ruby_2_4 0.10139702539891005 | |
ruby_2_4 0.1210133982822299 | |
ruby_2_4 0.09872106462717056 | |
ruby_2_4 0.12972754146903753 | |
trunk_oct 0.12838854361325502 | |
trunk_oct 0.12410090956836939 | |
trunk_oct 0.11200020927935839 | |
trunk_oct 0.10974986292421818 | |
trunk_oct 0.11278579756617546 | |
trunk 0.1150733856484294 | |
trunk 0.10835539177060127 | |
trunk 0.1078281830996275 | |
trunk 0.09894286841154099 | |
trunk 0.0969577869400382 | |
modified 0.11497108265757561 | |
modified 0.10831099934875965 | |
modified 0.11509297415614128 | |
modified 0.10960207972675562 | |
modified 0.1161925457417965 | |
----------------------------------------------------------- | |
loop_for | |
for i in 1..30_000_000 | |
# | |
end | |
ruby_2_4 0.9044722365215421 | |
ruby_2_4 0.8913315301761031 | |
ruby_2_4 0.8917335430160165 | |
ruby_2_4 0.9003735594451427 | |
ruby_2_4 0.891508269123733 | |
trunk_oct 0.9779127929359674 | |
trunk_oct 0.9779272573068738 | |
trunk_oct 0.9824546426534653 | |
trunk_oct 1.226051683537662 | |
trunk_oct 1.049929440021515 | |
trunk 1.0119363153353333 | |
trunk 1.0605404255911708 | |
trunk 1.0116948680952191 | |
trunk 1.0291864844039083 | |
trunk 1.017377712763846 | |
modified 0.9972810121253133 | |
modified 0.9777810694649816 | |
modified 0.9819500455632806 | |
modified 0.9814369948580861 | |
modified 0.9772939933463931 | |
----------------------------------------------------------- | |
loop_generator | |
max = 600000 | |
if defined? Fiber | |
gen = (1..max).each | |
loop do | |
gen.next | |
end | |
else | |
require 'generator' | |
gen = Generator.new((0..max)) | |
while gen.next? |