mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
Add build files for benchmarkings; add mandelbrot benchmark
This commit is contained in:
@@ -0,0 +1,64 @@
|
||||
# The Computer Language Benchmarks Game
|
||||
# http://shootout.alioth.debian.org/
|
||||
#
|
||||
# contributed by Karl von Laudermann
|
||||
# modified by Jeremy Echols
|
||||
size = 1000 # ARGV[0].to_i
|
||||
|
||||
puts "P4\n#{size} #{size}"
|
||||
|
||||
ITER = 49 # Iterations - 1 for easy for..in looping
|
||||
LIMIT_SQUARED = 4.0 # Presquared limit
|
||||
|
||||
byte_acc = 0
|
||||
bit_num = 0
|
||||
|
||||
count_size = size - 1 # Precomputed size for easy for..in looping
|
||||
def id(x)
|
||||
x
|
||||
end
|
||||
|
||||
# For..in loops are faster than .upto, .downto, .times, etc.
|
||||
for y in 0..count_size
|
||||
for x in 0..count_size
|
||||
zr = 0.0
|
||||
zi = 0.0
|
||||
cr = (2.0*x/size)-1.5
|
||||
ci = (2.0*y/size)-1.0
|
||||
escape = false
|
||||
|
||||
# To make use of the for..in code, we use a dummy variable,
|
||||
# like one would in C
|
||||
for dummy in 0..ITER
|
||||
tr = zr*zr - zi*zi + cr
|
||||
ti = 2*zr*zi + ci
|
||||
zr, zi = tr, ti
|
||||
|
||||
if (zr*zr+zi*zi) > LIMIT_SQUARED
|
||||
escape = true
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
# byte_acc = (byte_acc << 1) | (escape ? 0b0 : 0b1)
|
||||
byte_acc = (byte_acc * 2) | (escape ? 0b0 : 0b1)
|
||||
# byte_acc = (byte_acc * 2) + (escape ? 0b0 : 0b1)
|
||||
# byte_acc = (byte_acc * 2) + 1
|
||||
|
||||
bit_num += 1
|
||||
|
||||
# Code is very similar for these cases, but using separate blocks
|
||||
# ensures we skip the shifting when it's unnecessary, which is most cases.
|
||||
if (bit_num == 8)
|
||||
# print byte_acc.chr
|
||||
byte_acc = 0
|
||||
bit_num = 0
|
||||
elsif (x == count_size)
|
||||
byte_acc <<= (8 - bit_num)
|
||||
# byte_acc = byte_acc << (8 - bit_num)
|
||||
# print byte_acc.chr
|
||||
byte_acc = 0
|
||||
bit_num = 0
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,28 @@
|
||||
MRuby::Build.new do |conf|
|
||||
toolchain :gcc
|
||||
end
|
||||
|
||||
MRuby::Build.new('no_boxing') do |conf|
|
||||
toolchain :gcc
|
||||
|
||||
conf.gembox 'default'
|
||||
end
|
||||
|
||||
MRuby::Build.new('word_boxing') do |conf|
|
||||
toolchain :gcc
|
||||
|
||||
conf.gembox 'default'
|
||||
conf.compilers.each do |c|
|
||||
c.defines += %w(MRB_WORD_BOXING)
|
||||
end
|
||||
end
|
||||
|
||||
MRuby::Build.new('nan_boxing') do |conf|
|
||||
toolchain :gcc
|
||||
|
||||
conf.gembox 'default'
|
||||
conf.compilers.each do |c|
|
||||
c.defines += %w(MRB_NAN_BOXING)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
MRuby::Build.new do |conf|
|
||||
toolchain :gcc
|
||||
end
|
||||
|
||||
MRuby::Build.new('gcc') do |conf|
|
||||
toolchain :gcc
|
||||
conf.gembox 'default'
|
||||
end
|
||||
|
||||
MRuby::Build.new('clang') do |conf|
|
||||
toolchain :clang
|
||||
conf.gembox 'default'
|
||||
end
|
||||
@@ -1,8 +1,7 @@
|
||||
# Fib 39
|
||||
|
||||
def fib n
|
||||
return n if n < 2
|
||||
fib(n-2) + fib(n-1)
|
||||
end
|
||||
|
||||
puts fib(39)
|
||||
puts fib(37)
|
||||
@@ -0,0 +1,5 @@
|
||||
set yrange [0:]
|
||||
set terminal pdf
|
||||
set xtics rotate by -45
|
||||
set style histogram errorbars gap 2 lw 1
|
||||
set style fill solid border -1
|
||||
+34
-25
@@ -1,5 +1,5 @@
|
||||
module MRuby
|
||||
BENCHMARK_REPEAT = 2
|
||||
BENCHMARK_REPEAT = 4
|
||||
end
|
||||
|
||||
$dat_files = []
|
||||
@@ -15,10 +15,19 @@ end
|
||||
def plot
|
||||
opts_file = "#{MRUBY_ROOT}/benchmark/plot.gpl"
|
||||
opts = File.read(opts_file).each_line.to_a.map(&:strip).join(';')
|
||||
opts += ';plot '
|
||||
|
||||
dat_files = $dat_files.group_by {|f| File.dirname(f).split(File::SEPARATOR)[-1]}
|
||||
|
||||
build_config_name = if ENV['MRUBY_CONFIG']
|
||||
File.basename(ENV['MRUBY_CONFIG'], '.rb').gsub('build_config_', '')
|
||||
else
|
||||
"bm"
|
||||
end
|
||||
|
||||
opts += ";set output '#{File.join(MRUBY_ROOT, 'benchmark', "#{build_config_name}.pdf")}'"
|
||||
|
||||
opts += ';plot '
|
||||
|
||||
opts += dat_files.keys.map do |data_file|
|
||||
%Q['-' u 2:3:4:xtic(1) w hist title columnheader(1)]
|
||||
end.join(',')
|
||||
@@ -28,7 +37,7 @@ def plot
|
||||
|
||||
IO.popen(cmd, 'w') do |p|
|
||||
dat_files.each do |target_name, bm_files|
|
||||
p.puts target_name
|
||||
p.puts target_name.gsub('_', '-')
|
||||
bm_files.each do |bm_file|
|
||||
p.write File.read(bm_file)
|
||||
end
|
||||
@@ -39,33 +48,33 @@ end
|
||||
|
||||
|
||||
MRuby.each_target do |target|
|
||||
mruby_path = "#{target.build_dir}/bin/mruby"
|
||||
if File.file? mruby_path
|
||||
bm_files.each do |bm_file|
|
||||
bm_name = File.basename bm_file, ".rb"
|
||||
next if target.name == 'host'
|
||||
mruby_bin = "#{target.build_dir}/bin/mruby"
|
||||
|
||||
dat_dir = File.join('benchmark', target.name)
|
||||
dat_file = File.join(dat_dir, "#{bm_name}.dat")
|
||||
$dat_files << dat_file
|
||||
bm_files.each do |bm_file|
|
||||
bm_name = File.basename bm_file, ".rb"
|
||||
|
||||
directory dat_dir
|
||||
dat_dir = File.join('benchmark', target.name)
|
||||
dat_file = File.join(dat_dir, "#{bm_name}.dat")
|
||||
$dat_files << dat_file
|
||||
|
||||
file dat_file => [bm_file, dat_dir] do |task|
|
||||
print bm_name
|
||||
puts "..."
|
||||
directory dat_dir
|
||||
|
||||
data = (0...MRuby::BENCHMARK_REPEAT).map do |n|
|
||||
str = %x{(time -f "%e %S %U" #{mruby_path} #{bm_file}) 2>&1 >/dev/null}
|
||||
str.split(' ').map(&:to_f)
|
||||
end
|
||||
file dat_file => [bm_file, dat_dir, mruby_bin] do |task|
|
||||
print bm_name
|
||||
puts "..."
|
||||
|
||||
File.open(task.name, "w") do |f|
|
||||
data = data.map {|_,r,s| (r + s) / 2.0}
|
||||
min = data.min
|
||||
max = data.max
|
||||
avg = data.inject(&:+) / data.size
|
||||
f.puts "#{bm_name.gsub('_', '-')} #{avg} #{min} #{max}"
|
||||
end
|
||||
data = (0...MRuby::BENCHMARK_REPEAT).map do |n|
|
||||
str = %x{(time -f "%e %S %U" #{mruby_bin} #{bm_file}) 2>&1 >/dev/null}
|
||||
str.split(' ').map(&:to_f)
|
||||
end
|
||||
|
||||
File.open(task.name, "w") do |f|
|
||||
data = data.map {|_,r,s| (r + s) / 2.0}
|
||||
min = data.min
|
||||
max = data.max
|
||||
avg = data.inject(&:+) / data.size
|
||||
f.puts "#{bm_name.gsub('_', '-')} #{avg} #{min} #{max}"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user