Skip to content

Instantly share code, notes, and snippets.

@asaaki
Forked from actsasflinn/msgpack_benchmark.rb
Last active August 29, 2015 14:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save asaaki/3e2795068998d7bac8b8 to your computer and use it in GitHub Desktop.
Save asaaki/3e2795068998d7bac8b8 to your computer and use it in GitHub Desktop.
=begin
Message Pack vs similar utilities
ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-darwin13.0]
Packing
user system total real
pack: bert 60.850000 0.270000 61.120000 ( 62.003839)
pack: bson 2.750000 0.010000 2.760000 ( 2.799844)
pack: bson (moped) 12.260000 0.030000 12.290000 ( 12.468642)
pack: json 6.950000 0.020000 6.970000 ( 7.092319)
pack: marshal 6.870000 0.020000 6.890000 ( 6.976757)
pack: msgpack 1.210000 0.020000 1.230000 ( 1.233962)
pack: oj 0.850000 0.000000 0.850000 ( 0.861496)
pack: ox 1.030000 0.020000 1.050000 ( 1.073143)
pack: yajl 4.960000 0.200000 5.160000 ( 5.238507)
Unpacking
user system total real
unpack: bert 2.700000 0.000000 2.700000 ( 2.724727)
unpack: bson 17.630000 0.020000 17.650000 ( 17.935819)
unpack: bson (moped) 9.040000 0.010000 9.050000 ( 9.174655)
unpack: json 6.510000 0.070000 6.580000 ( 6.683261)
unpack: marshal 6.270000 0.010000 6.280000 ( 6.426111)
unpack: msgpack 2.630000 0.560000 3.190000 ( 3.245827)
unpack: oj 2.480000 0.000000 2.480000 ( 2.507248)
unpack: ox 2.620000 0.370000 2.990000 ( 3.476321)
unpack: yajl 6.690000 1.080000 7.770000 ( 7.930390)
Message Sizes
=================================
Marshal Size : 109
BERT Size : 165
BSON Size : 88
Moped::BSON Size : 88
JSON Size : 90
YAJL Size : 90
Oj Size : 90
Ox Size : 154
Message Pack Size: 73
=end
TEST_SIZE = 1_000_000
HEADING_OFFSET = 30
CAPTION_OFFSET = " " * (RUBY_VERSION =~ /^1\.8/ ? HEADING_OFFSET : 0)
puts "Message Pack vs similar utilities"
puts RUBY_DESCRIPTION
require "rubygems"
require "benchmark"
require "msgpack"
require "json"
require "yajl"
require "oj"
require "mongo"
require "moped"
require "bert"
require "ox"
duck = { "sound" => "quack", "name" => "Daffy", "feet" => 2, "wings" => true }
dude = { "sound" => "I'm the dude!", "name" => "Lebowski", "missing a rug" => true, "missing money" => 1_000_000.00 }
puts "\nPacking\n"
packs = {
"marshal" => proc{ Marshal.dump(duck) },
"bert" => proc{ BERT.encode(duck) },
"bson" => proc{ BSON.serialize(duck) },
"bson (moped)" => proc{ Moped::BSON::Document.serialize(duck) },
"json" => proc{ JSON.dump(duck) },
"yajl" => proc{ Yajl::Encoder.encode(duck) },
"oj" => proc{ Oj.dump(duck) },
"ox" => proc{ Ox.dump(duck) },
"msgpack" => proc{ MessagePack.pack(duck) },
}
Benchmark.benchmark(CAPTION_OFFSET + Benchmark::Tms::CAPTION, HEADING_OFFSET) do |b|
packs.keys.sort.each do |name|
test = packs[name]
b.report("pack: " + name) do
TEST_SIZE.times(&test)
end
GC.start
end
end
puts "\nUnpacking\n"
Benchmark.benchmark(CAPTION_OFFSET + Benchmark::Tms::CAPTION, HEADING_OFFSET) do |b|
br = BERT.encode(dude)
bs = BSON.serialize(dude)
js = JSON.dump(dude)
ms = Marshal.dump(dude)
mp = MessagePack.pack(dude)
ox = Ox.dump(dude)
yj = Yajl::Encoder.encode(dude)
oj = Oj.dump(dude)
md = StringIO.new(Moped::BSON::Document.serialize(dude))
unpacks = {
"marshal" => proc{ Marshal.load(ms) },
"bert" => proc{ BERT.decode(br) },
"bson" => proc{ BSON.deserialize(bs) },
"bson (moped)" => proc{ Moped::BSON::Document.deserialize(md.tap(&:rewind)) },
"json" => proc{ JSON.parse(js) },
"yajl" => proc{ Yajl::Parser.parse(yj) },
"oj" => proc{ Oj.load(oj) },
"ox" => proc{ Ox.parse_obj(ox) },
"msgpack" => proc{ MessagePack.unpack(mp) },
}
unpacks.keys.sort.each do |name|
test = unpacks[name]
b.report("unpack: " + name) do
TEST_SIZE.times(&test)
end
GC.start
end
puts "\nMessage Sizes"
puts "================================="
puts "Marshal Size : #{ms.size}"
puts "BERT Size : #{br.size}"
puts "BSON Size : #{bs.size}"
puts "Moped::BSON Size : #{md.size}"
puts "JSON Size : #{js.size}"
puts "YAJL Size : #{yj.size}"
puts "Oj Size : #{oj.size}"
puts "Ox Size : #{ox.size}"
puts "Message Pack Size: #{mp.size}"
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment