Skip to content

Instantly share code, notes, and snippets.

@oldmoe
Created April 19, 2025 02:53
Show Gist options
  • Save oldmoe/f1af325b0d51f749fe469512fe68dfdc to your computer and use it in GitHub Desktop.
Save oldmoe/f1af325b0d51f749fe469512fe68dfdc to your computer and use it in GitHub Desktop.
Oj vs JSON vs Msgpack vs CBOR benchmark
require 'oj'
require 'json'
require 'msgpack'
require 'cbor'
require 'benchmark/ips'
RubyVM::YJIT.enable
mpacker = MessagePack::Packer.new
munpacker = MessagePack::Unpacker.new
encoders = {
oj: proc{|doc| Oj.dump(doc)},
json: proc{|doc| JSON.dump(doc)},
cbor: proc{|doc| CBOR.encode(doc)},
msgpack: proc{|doc| mpacker.reset; mpacker.pack(doc).to_s },
}
decoders = {
oj: proc{|doc| Oj.load(doc)},
json: proc{|doc| JSON.load(doc)},
cbor: proc{|doc| CBOR.decode(doc)},
msgpack: proc{|doc| munpacker.reset; munpacker.feed(doc).unpack },
}
encoded = {}
docs = {}
Dir.each_child('./docs') do |child|
docs[child] = JSON.load_file("./docs/#{child}")
end
docs.each_pair do |doc, data|
encoders.each_pair do |k, v|
encoded[k] = {} unless encoded[k].is_a?(Hash)
encoded[k][doc] = encoders[k].call(data)
end
end
docs.each_pair do |doc, data|
puts "benchmarking document: #{doc}"
puts "------------------------------------"
puts "size benchmark"
puts "------------------------------------"
puts "encoder\t\traw\tlz4\tzstd"
encoders.each_pair do |title, encoder|
packed = encoder.call(data)
puts "#{title}\t\t#{packed.bytesize}\t#{LZ4.compress(packed).bytesize}\t#{Zstd.compress(packed).bytesize}"
end
puts
puts "encoding benchmark"
puts "------------------------------------"
Benchmark.ips do |x|
encoders.each_pair do |title, encoder|
x.report(title) { encoder.call(data) }
end
end
puts
puts "decoding benchmark"
puts "------------------------------------"
Benchmark.ips do |x|
decoders.each_pair do |title, decoder|
x.report(title) { decoder.call(encoded[title][doc]) }
end
end
puts
puts "===================================="
puts
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment