Permalink
Browse files

make decoder bench test C ext and Ruby version

  • Loading branch information...
1 parent 1bb3ed5 commit e367e8f09541689cf8359dd95b2d066efd3a9191 @mojombo mojombo committed Oct 26, 2009
Showing with 80 additions and 39 deletions.
  1. +10 −0 Rakefile
  2. +69 −38 bench/decode_bench.rb
  3. +1 −1 ext/bert/c/decode.c
View
10 Rakefile
@@ -27,6 +27,16 @@ Rake::TestTask.new(:runtests) do |test|
test.verbose = true
end
+task :make do
+ Dir.chdir('ext/bert/c') { `make` }
+end
+
+task :clean do
+ ['rm -f ext/bert/c/*.bundle', 'rm -f ext/bert/c/*.o'].each do |cmd|
+ `#{cmd}` && puts(cmd)
+ end
+end
+
task :test => :check_dependencies do
require 'fileutils'
View
107 bench/decode_bench.rb
@@ -1,56 +1,87 @@
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
require 'rubygems'
-require 'bert'
require 'json'
require 'yajl'
require 'benchmark'
ITER = 1_000
-tiny = t[:ok, :awesome]
-small = t[:ok, :answers, [42] * 42]
-large = ["abc" * 1000] * 100
-complex = [42, {:foo => 'bac' * 100}, t[(1..100).to_a]] * 10
+def setup
+ tiny = t[:ok, :awesome]
+ small = t[:ok, :answers, [42] * 42]
+ large = ["abc" * 1000] * 100
+ complex = [42, {:foo => 'bac' * 100}, t[(1..100).to_a]] * 10
-tiny_encoded_bert = BERT.encode(tiny)
-small_encoded_bert = BERT.encode(small)
-large_encoded_bert = BERT.encode(large)
-complex_encoded_bert = BERT.encode(complex)
+ $tiny_encoded_bert = BERT.encode(tiny)
+ $small_encoded_bert = BERT.encode(small)
+ $large_encoded_bert = BERT.encode(large)
+ $complex_encoded_bert = BERT.encode(complex)
-tiny_encoded_json = JSON.dump(tiny)
-small_encoded_json = JSON.dump(small)
-large_encoded_json = JSON.dump(large)
-complex_encoded_json = JSON.dump(complex)
+ $tiny_encoded_json = JSON.dump(tiny)
+ $small_encoded_json = JSON.dump(small)
+ $large_encoded_json = JSON.dump(large)
+ $complex_encoded_json = JSON.dump(complex)
-tiny_encoded_yajl = Yajl::Encoder.encode(tiny)
-small_encoded_yajl = Yajl::Encoder.encode(small)
-large_encoded_yajl = Yajl::Encoder.encode(large)
-complex_encoded_yajl = Yajl::Encoder.encode(complex)
+ $tiny_encoded_yajl = Yajl::Encoder.encode(tiny)
+ $small_encoded_yajl = Yajl::Encoder.encode(small)
+ $large_encoded_yajl = Yajl::Encoder.encode(large)
+ $complex_encoded_yajl = Yajl::Encoder.encode(complex)
-tiny_encoded_ruby = Marshal.dump(tiny)
-small_encoded_ruby = Marshal.dump(small)
-large_encoded_ruby = Marshal.dump(large)
-complex_encoded_ruby = Marshal.dump(complex)
+ $tiny_encoded_ruby = Marshal.dump(tiny)
+ $small_encoded_ruby = Marshal.dump(small)
+ $large_encoded_ruby = Marshal.dump(large)
+ $complex_encoded_ruby = Marshal.dump(complex)
+end
Benchmark.bm(13) do |bench|
- bench.report("BERT tiny") {ITER.times {BERT.decode(tiny_encoded_bert)}}
- bench.report("BERT small") {ITER.times {BERT.decode(small_encoded_bert)}}
- bench.report("BERT large") {ITER.times {BERT.decode(large_encoded_bert)}}
- bench.report("BERT complex") {ITER.times {BERT.decode(complex_encoded_bert)}}
- puts
- bench.report("JSON tiny") {ITER.times {JSON.load(tiny_encoded_json)}}
- bench.report("JSON small") {ITER.times {JSON.load(small_encoded_json)}}
- bench.report("JSON large") {ITER.times {JSON.load(large_encoded_json)}}
- bench.report("JSON complex") {ITER.times {JSON.load(complex_encoded_json)}}
+ pid = fork do
+ Dir.chdir(File.join(File.dirname(__FILE__), *%w[.. ext bert c])) { `make` }
+ require 'bert'
+ raise "Could not load C extension" unless BERT::Decode.impl == 'C'
+ setup
+ puts "BERT C Extension Decoder"
+ bench.report("BERT tiny") {ITER.times {BERT.decode($tiny_encoded_bert)}}
+ bench.report("BERT small") {ITER.times {BERT.decode($small_encoded_bert)}}
+ bench.report("BERT large") {ITER.times {BERT.decode($large_encoded_bert)}}
+ bench.report("BERT complex") {ITER.times {BERT.decode($complex_encoded_bert)}}
+ puts
+ end
+ Process.waitpid(pid)
+
+ pid = fork do
+ Dir.chdir(File.join(File.dirname(__FILE__), *%w[.. ext bert c])) do
+ ['*.bundle', '*.o'].each { |pat| `rm -f #{pat}` }
+ end
+ require 'bert'
+ raise "Not using Ruby decoder" unless BERT::Decode.impl == 'Ruby'
+ setup
+ puts "BERT Pure Ruby Decoder"
+ bench.report("BERT tiny") {ITER.times {BERT.decode($tiny_encoded_bert)}}
+ bench.report("BERT small") {ITER.times {BERT.decode($small_encoded_bert)}}
+ bench.report("BERT large") {ITER.times {BERT.decode($large_encoded_bert)}}
+ bench.report("BERT complex") {ITER.times {BERT.decode($complex_encoded_bert)}}
+ puts
+ end
+ Process.waitpid(pid)
+
+ require 'bert'
+ setup
+
+ bench.report("JSON tiny") {ITER.times {JSON.load($tiny_encoded_json)}}
+ bench.report("JSON small") {ITER.times {JSON.load($small_encoded_json)}}
+ bench.report("JSON large") {ITER.times {JSON.load($large_encoded_json)}}
+ bench.report("JSON complex") {ITER.times {JSON.load($complex_encoded_json)}}
puts
- bench.report("YAJL tiny") {ITER.times {Yajl::Parser.parse(tiny_encoded_yajl)}}
- bench.report("YAJL small") {ITER.times {Yajl::Parser.parse(small_encoded_yajl)}}
- bench.report("YAJL large") {ITER.times {Yajl::Parser.parse(large_encoded_yajl)}}
- bench.report("YAJL complex") {ITER.times {Yajl::Parser.parse(complex_encoded_yajl)}}
+
+ bench.report("YAJL tiny") {ITER.times {Yajl::Parser.parse($tiny_encoded_yajl)}}
+ bench.report("YAJL small") {ITER.times {Yajl::Parser.parse($small_encoded_yajl)}}
+ bench.report("YAJL large") {ITER.times {Yajl::Parser.parse($large_encoded_yajl)}}
+ bench.report("YAJL complex") {ITER.times {Yajl::Parser.parse($complex_encoded_yajl)}}
puts
- bench.report("Ruby tiny") {ITER.times {Marshal.load(tiny_encoded_ruby)}}
- bench.report("Ruby small") {ITER.times {Marshal.load(small_encoded_ruby)}}
- bench.report("Ruby large") {ITER.times {Marshal.load(large_encoded_ruby)}}
- bench.report("Ruby complex") {ITER.times {Marshal.load(complex_encoded_ruby)}}
+
+ bench.report("Ruby tiny") {ITER.times {Marshal.load($tiny_encoded_ruby)}}
+ bench.report("Ruby small") {ITER.times {Marshal.load($small_encoded_ruby)}}
+ bench.report("Ruby large") {ITER.times {Marshal.load($large_encoded_ruby)}}
+ bench.report("Ruby complex") {ITER.times {Marshal.load($complex_encoded_ruby)}}
end
View
2 ext/bert/c/decode.c
@@ -429,7 +429,7 @@ VALUE method_decode(VALUE klass, VALUE rString) {
}
VALUE method_impl(VALUE klass) {
- return rb_str_new("C", 2);
+ return rb_str_new("C", 1);
}
void Init_decode() {

0 comments on commit e367e8f

Please sign in to comment.