Created
April 19, 2025 02:53
-
-
Save oldmoe/f1af325b0d51f749fe469512fe68dfdc to your computer and use it in GitHub Desktop.
Oj vs JSON vs Msgpack vs CBOR benchmark
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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