# Create a pool for repeated usepool=factory.pool(10)# Fast: Reuses packer from pool1000.timesdo|i|pool.pack(id: i,value: "data")end
Use streaming for large data
# Memory efficient for large filesbuffer=Messagepack::BinaryBuffer.new(File.open("large.msgpack","rb"))unpacker=Messagepack::Unpacker.new(buffer)whileobj=unpacker.readprocess(obj)# One object at a timeend
Minimize extension type overhead
# Faster: Use native types in hashdata={type: "user",id: 123}# Slower: Custom type class requires registry lookupdata=DataWrapper.new("user",123)
# Compare factory vs poolfactory=Messagepack::Factory.newpool=factory.pool(5)Benchmark.bmdo|x|x.report("factory:")do1000.times{factory.pack(data)}endx.report("pool:")do1000.times{pool.pack(data)}endend
Performance characteristics
Typical performance on modern hardware:
Packing simple values: 500k-700k ops/sec
Packing small arrays: 200k-300k ops/sec
Packing small hashes: 150k-200k ops/sec
Buffer operations: ~30% faster with coalescing
Your results will vary based on: * Data size and complexity * Ruby implementation (MRI, JRuby, TruffleRuby) * Hardware and OS * Number of registered extension types
Common pitfalls
Creating new factories repeatedly
# Bad: Creates new factory each timedefprocess(data)factory=Messagepack::Factory.newfactory.pack(data)end# Good: Reuse factoryFACTORY=Messagepack::Factory.new.freezedefprocess(data)FACTORY.pack(data)end
Not using pools in threads
# Bad: Shared unpacker is not thread-safeUNPACKER=Messagepack::Unpacker.newthreads.mapdoThread.new{UNPACKER.unpack(data)}end# Good: Use poolpool=factory.pool(10)threads.mapdoThread.new{pool.unpack(data)}end