From a96b871c463591b9e8d6f0fa541665dfc2769539 Mon Sep 17 00:00:00 2001 From: furunkel Date: Thu, 23 Apr 2015 22:27:19 +0200 Subject: Add task for running and plotting benchmarks --- tasks/benchmark.rake | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++ tasks/mruby_build.rake | 1 + 2 files changed, 83 insertions(+) create mode 100644 tasks/benchmark.rake (limited to 'tasks') diff --git a/tasks/benchmark.rake b/tasks/benchmark.rake new file mode 100644 index 000000000..f682f8ee1 --- /dev/null +++ b/tasks/benchmark.rake @@ -0,0 +1,82 @@ +module MRuby + BENCHMARK_REPEAT = 2 +end + +$dat_files = [] + +def bm_files + Dir.glob("#{MRUBY_ROOT}/benchmark/*.rb") +end + +def plot_file + File.join(MRUBY_ROOT, 'benchmark', 'bm.pdf') +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]} + + opts += dat_files.keys.map do |data_file| + %Q['-' u 2:3:4:xtic(1) w hist title columnheader(1)] + end.join(',') + opts += ';' + + cmd = %Q{gnuplot -p -e "#{opts}"} + + IO.popen(cmd, 'w') do |p| + dat_files.each do |target_name, bm_files| + p.puts target_name + bm_files.each do |bm_file| + puts target_name + p.write File.read(bm_file) + print File.read(bm_file) + end + p.puts "e" + end + end +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" + + dat_dir = File.join('benchmark', target.name) + dat_file = File.join(dat_dir, "#{bm_name}.dat") + $dat_files << dat_file + + directory dat_dir + + file dat_file => [bm_file, dat_dir] do |task| + print bm_name + puts "..." + + 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.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 + end +end + +file plot_file => $dat_files do + plot +end + +task :benchmark => plot_file do + plot +end diff --git a/tasks/mruby_build.rake b/tasks/mruby_build.rake index 8438b6ca4..66608286d 100644 --- a/tasks/mruby_build.rake +++ b/tasks/mruby_build.rake @@ -8,6 +8,7 @@ module MRuby end def each_target(&block) + return to_enum(:each_target) if block.nil? @targets.each do |key, target| target.instance_eval(&block) end -- cgit v1.2.3 From 96d66f6d241374cd5b4423aab8e0a6289fdf697c Mon Sep 17 00:00:00 2001 From: furunkel Date: Thu, 23 Apr 2015 22:34:22 +0200 Subject: Don't echo to stdout --- tasks/benchmark.rake | 2 -- 1 file changed, 2 deletions(-) (limited to 'tasks') diff --git a/tasks/benchmark.rake b/tasks/benchmark.rake index f682f8ee1..c2f93d82d 100644 --- a/tasks/benchmark.rake +++ b/tasks/benchmark.rake @@ -30,9 +30,7 @@ def plot dat_files.each do |target_name, bm_files| p.puts target_name bm_files.each do |bm_file| - puts target_name p.write File.read(bm_file) - print File.read(bm_file) end p.puts "e" end -- cgit v1.2.3 From 465d7a23c89d385e1c419a7bd1546b0bf41bf097 Mon Sep 17 00:00:00 2001 From: furunkel Date: Fri, 24 Apr 2015 13:40:54 +0200 Subject: Add build files for benchmarkings; add mandelbrot benchmark --- benchmark/bm_so_mandelbrot.rb | 64 +++++++++++++++++++++++++++++++++++++ benchmark/build_config_boxing.rb | 28 ++++++++++++++++ benchmark/build_config_cc.rb | 13 ++++++++ benchmark/fib.rb | 7 ++++ benchmark/fib39.rb | 8 ----- benchmark/plot.gpl | 5 +++ tasks/benchmark.rake | 69 +++++++++++++++++++++++----------------- 7 files changed, 156 insertions(+), 38 deletions(-) create mode 100644 benchmark/bm_so_mandelbrot.rb create mode 100644 benchmark/build_config_boxing.rb create mode 100644 benchmark/build_config_cc.rb create mode 100644 benchmark/fib.rb delete mode 100644 benchmark/fib39.rb create mode 100644 benchmark/plot.gpl (limited to 'tasks') diff --git a/benchmark/bm_so_mandelbrot.rb b/benchmark/bm_so_mandelbrot.rb new file mode 100644 index 000000000..dd1d75ba1 --- /dev/null +++ b/benchmark/bm_so_mandelbrot.rb @@ -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 diff --git a/benchmark/build_config_boxing.rb b/benchmark/build_config_boxing.rb new file mode 100644 index 000000000..b478c9005 --- /dev/null +++ b/benchmark/build_config_boxing.rb @@ -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 + diff --git a/benchmark/build_config_cc.rb b/benchmark/build_config_cc.rb new file mode 100644 index 000000000..56d725bc7 --- /dev/null +++ b/benchmark/build_config_cc.rb @@ -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 diff --git a/benchmark/fib.rb b/benchmark/fib.rb new file mode 100644 index 000000000..4b395f9cc --- /dev/null +++ b/benchmark/fib.rb @@ -0,0 +1,7 @@ + +def fib n + return n if n < 2 + fib(n-2) + fib(n-1) +end + +puts fib(37) diff --git a/benchmark/fib39.rb b/benchmark/fib39.rb deleted file mode 100644 index d5565b779..000000000 --- a/benchmark/fib39.rb +++ /dev/null @@ -1,8 +0,0 @@ -# Fib 39 - -def fib n - return n if n < 2 - fib(n-2) + fib(n-1) -end - -puts fib(39) diff --git a/benchmark/plot.gpl b/benchmark/plot.gpl new file mode 100644 index 000000000..639674d68 --- /dev/null +++ b/benchmark/plot.gpl @@ -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 diff --git a/tasks/benchmark.rake b/tasks/benchmark.rake index c2f93d82d..18802708e 100644 --- a/tasks/benchmark.rake +++ b/tasks/benchmark.rake @@ -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" - - dat_dir = File.join('benchmark', target.name) - dat_file = File.join(dat_dir, "#{bm_name}.dat") - $dat_files << dat_file - - directory dat_dir - - file dat_file => [bm_file, dat_dir] do |task| - print bm_name - puts "..." - - 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.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 + next if target.name == 'host' + mruby_bin = "#{target.build_dir}/bin/mruby" + + bm_files.each do |bm_file| + bm_name = File.basename bm_file, ".rb" + + dat_dir = File.join('benchmark', target.name) + dat_file = File.join(dat_dir, "#{bm_name}.dat") + $dat_files << dat_file + + directory dat_dir + + file dat_file => [bm_file, dat_dir, mruby_bin] do |task| + print bm_name + puts "..." + + 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 -- cgit v1.2.3 From 8f5ec1a60ff5e93377fdfcfcf3dc141136a8660a Mon Sep 17 00:00:00 2001 From: furunkel Date: Fri, 24 Apr 2015 14:19:51 +0200 Subject: Let all benchmarks start with bm_ --- benchmark/bm_fib.rb | 7 +++++++ benchmark/fib.rb | 7 ------- tasks/benchmark.rake | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) create mode 100644 benchmark/bm_fib.rb delete mode 100644 benchmark/fib.rb (limited to 'tasks') diff --git a/benchmark/bm_fib.rb b/benchmark/bm_fib.rb new file mode 100644 index 000000000..4b395f9cc --- /dev/null +++ b/benchmark/bm_fib.rb @@ -0,0 +1,7 @@ + +def fib n + return n if n < 2 + fib(n-2) + fib(n-1) +end + +puts fib(37) diff --git a/benchmark/fib.rb b/benchmark/fib.rb deleted file mode 100644 index 4b395f9cc..000000000 --- a/benchmark/fib.rb +++ /dev/null @@ -1,7 +0,0 @@ - -def fib n - return n if n < 2 - fib(n-2) + fib(n-1) -end - -puts fib(37) diff --git a/tasks/benchmark.rake b/tasks/benchmark.rake index 18802708e..3372c900a 100644 --- a/tasks/benchmark.rake +++ b/tasks/benchmark.rake @@ -5,7 +5,7 @@ end $dat_files = [] def bm_files - Dir.glob("#{MRUBY_ROOT}/benchmark/*.rb") + Dir.glob("#{MRUBY_ROOT}/benchmark/bm_*.rb") end def plot_file -- cgit v1.2.3 From bb1951a8b60cd290b6fff7b4dcc2fe52a69ff6d5 Mon Sep 17 00:00:00 2001 From: furunkel Date: Fri, 24 Apr 2015 14:54:35 +0200 Subject: Include name of current build config in data directory name --- tasks/benchmark.rake | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) (limited to 'tasks') diff --git a/tasks/benchmark.rake b/tasks/benchmark.rake index 3372c900a..28e100fbb 100644 --- a/tasks/benchmark.rake +++ b/tasks/benchmark.rake @@ -12,18 +12,20 @@ def plot_file File.join(MRUBY_ROOT, 'benchmark', 'bm.pdf') end +def build_config_name + if ENV['MRUBY_CONFIG'] + File.basename(ENV['MRUBY_CONFIG'], '.rb').gsub('build_config_', '') + else + "build" + end +end + def plot opts_file = "#{MRUBY_ROOT}/benchmark/plot.gpl" opts = File.read(opts_file).each_line.to_a.map(&:strip).join(';') 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 ' @@ -54,7 +56,7 @@ MRuby.each_target do |target| bm_files.each do |bm_file| bm_name = File.basename bm_file, ".rb" - dat_dir = File.join('benchmark', target.name) + dat_dir = File.join('benchmark', "#{build_config_name}_#{target.name}") dat_file = File.join(dat_dir, "#{bm_name}.dat") $dat_files << dat_file -- cgit v1.2.3 From 00518e0a4b134c5eb18802ccb9c0d5672923b7b2 Mon Sep 17 00:00:00 2001 From: furunkel Date: Fri, 24 Apr 2015 16:24:31 +0200 Subject: Use separate build config directory for benchmark files --- tasks/benchmark.rake | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'tasks') diff --git a/tasks/benchmark.rake b/tasks/benchmark.rake index 28e100fbb..97b2e7448 100644 --- a/tasks/benchmark.rake +++ b/tasks/benchmark.rake @@ -37,6 +37,7 @@ def plot cmd = %Q{gnuplot -p -e "#{opts}"} + p cmd IO.popen(cmd, 'w') do |p| dat_files.each do |target_name, bm_files| p.puts target_name.gsub('_', '-') @@ -56,7 +57,7 @@ MRuby.each_target do |target| bm_files.each do |bm_file| bm_name = File.basename bm_file, ".rb" - dat_dir = File.join('benchmark', "#{build_config_name}_#{target.name}") + dat_dir = File.join('benchmark', build_config_name, target.name) dat_file = File.join(dat_dir, "#{bm_name}.dat") $dat_files << dat_file -- cgit v1.2.3 From 6110b385a7d53655fb74ef9fb19497b2111ce42c Mon Sep 17 00:00:00 2001 From: furunkel Date: Fri, 24 Apr 2015 21:58:27 +0200 Subject: Output PNG instead of PDF --- .gitignore | 1 + benchmark/plot.gpl | 2 +- tasks/benchmark.rake | 11 +++++------ 3 files changed, 7 insertions(+), 7 deletions(-) (limited to 'tasks') diff --git a/.gitignore b/.gitignore index e3f434432..1a8c5990c 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ *.o /benchmark/**/*.dat /benchmark/*.pdf +/benchmark/*.png *.orig *.pdb *.rej diff --git a/benchmark/plot.gpl b/benchmark/plot.gpl index 21a55dd3d..725e2ec1c 100644 --- a/benchmark/plot.gpl +++ b/benchmark/plot.gpl @@ -1,5 +1,5 @@ set yrange [0:] -set terminal pdf font 'Sans, 3' +set terminal pngcairo font 'Sans, 8' lw 1 size 1400,1024 set xtics rotate by -45 set style histogram errorbars gap 2 lw 1 set style fill solid border -1 diff --git a/tasks/benchmark.rake b/tasks/benchmark.rake index 97b2e7448..84e69ebee 100644 --- a/tasks/benchmark.rake +++ b/tasks/benchmark.rake @@ -8,10 +8,6 @@ def bm_files Dir.glob("#{MRUBY_ROOT}/benchmark/bm_*.rb") end -def plot_file - File.join(MRUBY_ROOT, 'benchmark', 'bm.pdf') -end - def build_config_name if ENV['MRUBY_CONFIG'] File.basename(ENV['MRUBY_CONFIG'], '.rb').gsub('build_config_', '') @@ -20,13 +16,17 @@ def build_config_name end end +def plot_file + File.join(MRUBY_ROOT, 'benchmark', "#{build_config_name}.png") +end + def plot opts_file = "#{MRUBY_ROOT}/benchmark/plot.gpl" opts = File.read(opts_file).each_line.to_a.map(&:strip).join(';') dat_files = $dat_files.group_by {|f| File.dirname(f).split(File::SEPARATOR)[-1]} - opts += ";set output '#{File.join(MRUBY_ROOT, 'benchmark', "#{build_config_name}.pdf")}'" + opts += ";set output '#{plot_file}'" opts += ';plot ' @@ -37,7 +37,6 @@ def plot cmd = %Q{gnuplot -p -e "#{opts}"} - p cmd IO.popen(cmd, 'w') do |p| dat_files.each do |target_name, bm_files| p.puts target_name.gsub('_', '-') -- cgit v1.2.3