Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 66 additions & 1 deletion bench/bench.rb
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
'status' => 200,
'bytes' => 2326,
'referer' => 'http://www.example.com/start.html',
'agent' => 'Mozilla/4.08 [en] (Win98; I ;Nav)',
'agent' => 'Mozilla/4.08 [en] (Win98; I ;Nav)'
}

data_structured = MessagePack.pack(object_structured)
Expand All @@ -46,6 +46,41 @@ def self.from_msgpack_ext(data)
extended_packer.register_type(0x00, Extended, :to_msgpack_ext)
data_extended = extended_packer.pack(object_extended).to_s

# Struct for optimized_struct benchmarks
BenchStruct = Struct.new(:name, :age, :email, :score, :active)

# Factory with optimized_struct (C-level fast path)
factory_optimized = MessagePack::Factory.new
factory_optimized.register_type(0x01, BenchStruct, optimized_struct: true)

# Factory with recursive packer/unpacker (Ruby-level)
factory_recursive = MessagePack::Factory.new
factory_recursive.register_type(
0x01,
BenchStruct,
packer: lambda { |obj, packer|
packer.write(obj.name)
packer.write(obj.age)
packer.write(obj.email)
packer.write(obj.score)
packer.write(obj.active)
},
unpacker: lambda { |unpacker|
BenchStruct.new(unpacker.read, unpacker.read, unpacker.read, unpacker.read, unpacker.read)
},
recursive: true
)

object_struct = BenchStruct.new('Alice', 30, '[email protected]', 95.5, true)
data_struct_optimized = factory_optimized.dump(object_struct)
data_struct_recursive = factory_recursive.dump(object_struct)

# Pre-create packers/unpackers for fair comparison (avoid factory overhead in loop)
packer_optimized = factory_optimized.packer
packer_recursive = factory_recursive.packer
unpacker_optimized = factory_optimized.unpacker
unpacker_recursive = factory_recursive.unpacker

Benchmark.ips do |x|
x.report('pack-plain') do
MessagePack.pack(object_plain)
Expand All @@ -61,6 +96,22 @@ def self.from_msgpack_ext(data)
packer.pack(object_extended).to_s
end

x.report('pack-struct-optimized') do
packer_optimized.write(object_struct)
packer_optimized.to_s
packer_optimized.clear
end

x.report('pack-struct-recursive') do
packer_recursive.write(object_struct)
packer_recursive.to_s
packer_recursive.clear
end

x.compare!
end

Benchmark.ips do |x|
x.report('unpack-plain') do
MessagePack.unpack(data_plain)
end
Expand All @@ -75,4 +126,18 @@ def self.from_msgpack_ext(data)
unpacker.feed data_extended
unpacker.read
end

x.report('unpack-struct-optimized') do
unpacker_optimized.feed(data_struct_optimized)
unpacker_optimized.read
unpacker_optimized.reset
end

x.report('unpack-struct-recursive') do
unpacker_recursive.feed(data_struct_recursive)
unpacker_recursive.read
unpacker_recursive.reset
end

x.compare!
end
Loading