Transmutation provides a very simple and elegant DSL that outperforms the majority of other serializers on the market. It also boasts consistent performance with small standard deviation.
* Benchmarks were ran on a MacBook Pro M1 Pro with the following Ruby version: ruby 3.2.5 (2024-07-26 revision 31d0f1a2e7) +YJIT [arm64-darwin24]
The following objects are used for serialization:
organisation = Organisation.new(id: 1, name: "Example Inc.") # Serialize with no associations
user = User.new(id: 1, first_name: "John", last_name: "Doe", organisation_id: 1) # Serialize with many Posts
post = Post.new(id: 1, title: "Sample Post", body: "Sample Body", user_id: 1) # Serialize with one User
organisations = [organisation] + 29.times.map { Organisation.new(id: _1 + 2, name: "Example Inc. #{_1 + 2}") }
Gem | IPS | Comparison | Allocations | Comparison |
---|---|---|---|---|
alba 3.6.0 | 473.982k ± 1.6% | baseline | 1.128k | 1.11x more |
panko_serializer 0.8.3 | 337.389k ±10.6% | 1.40x slower | 1.016k | baseline |
transmutation 0.5.1 | 314.398k ± 9.2% | 1.51x slower | 1.040k | 1.02x more |
active_model_serializers 0.10.15 | 202.110k ± 3.6% | 2.35x slower | 1.992k | 1.96x more |
representable 3.2.0 | 157.150k ± 3.2% | 3.02x slower | 4.304k | 4.24x more |
rabl 0.17.0 | 105.862k ± 5.3% | 4.48x slower | 5.856k | 5.76x more |
jbuilder 2.13.0 | 88.011k ± 6.6% | 5.39x slower | 2.208k | 2.17x more |
JSON Output:
{"id":1,"name":"Example Inc.","logo_url":"https://example.com/logos/companies/1"}
Gem | IPS | Comparison | Allocations | Comparison |
---|---|---|---|---|
alba 3.6.0 | 214.622k ± 1.2% | baseline | 1.912k | baseline |
transmutation 0.5.1 | 168.840k ± 1.5% | 1.27x slower | 2.288k | 1.20x more |
panko_serializer 0.8.3 | 127.328k ± 4.2% | 1.69x slower | 4.128k | 2.16x more |
representable 3.2.0 | 81.974k ± 2.5% | 2.62x slower | 6.184k | 3.23x more |
active_model_serializers 0.10.15 | 62.949k ± 1.3% | 3.41x slower | 5.840k | 3.05x more |
rabl 0.17.0 | 57.561k ± 3.3% | 3.73x slower | 9.608k | 5.03x more |
jbuilder 2.13.0 | 43.080k ± 2.3% | 4.98x slower | 3.856k | 2.02x more |
JSON Output:
{"id":1,"title":"Sample Post","body":"Sample Body","user":{"id":1,"first_name":"John","full_name":"John Doe"}}
Gem | IPS | Comparison | Allocations | Comparison |
---|---|---|---|---|
panko_serializer 0.8.3 | 223.232k ± 2.5% | baseline | 1.376k | baseline |
alba 3.6.0 | 160.667k ± 1.1% | 1.39x slower | 2.440k | 1.77x more |
transmutation 0.5.1 | 124.635k ± 3.4% | 1.79x slower | 3.656k | 2.66x more |
representable 3.2.0 | 53.158k ± 1.2% | 4.20x slower | 9.640k | 7.01x more |
active_model_serializers 0.10.15 | 43.965k ± 3.7% | 5.08x slower | 8.728k | 6.34x more |
jbuilder 2.13.0 | 43.513k ± 2.8% | 5.13x slower | 4.704k | 3.42x more |
rabl 0.17.0 | 28.359k ± 1.2% | 7.87x slower | 10.912k | 7.93x more |
JSON Output:
{"id":1,"first_name":"John","full_name":"John Doe","posts":[{"id":1,"title":"Post 1","body":"Sample body 1"},{"id":3,"title":"Post 3","body":"Sample body 3"}]}
Gem | IPS | Comparison | Allocations | Comparison |
---|---|---|---|---|
panko_serializer 0.8.3 | 69.118k ± 1.1% | baseline | 7.616k | baseline |
alba 3.6.0 | 26.113k ± 1.2% | 2.65x slower | 15.911k | 2.09x more |
transmutation 0.5.1 | 20.735k ± 1.2% | 3.33x slower | 28.183k | 3.70x more |
rabl 0.17.0 | 11.969k ± 1.1% | 5.77x slower | 21.527k | 2.83x more |
active_model_serializers 0.10.15 | 7.514k ± 3.3% | 9.20x slower | 69.927k | 9.18x more |
jbuilder 2.13.0 | 5.589k ±18.9% | 12.37x slower | 32.662k | 4.29x more |
representable 3.2.0 | 4.953k ± 1.0% | 13.96x slower | 160.543k | 21.08x more |
JSON Output:
[{"id":1,"name":"Example Inc.","logo_url":"https://example.com/logos/companies/1"},{"id":2,"name":"Example Inc. 2","logo_url":"https://example.com/logos/companies/2"},{"id":3,"name":"Example Inc. 3","logo_url":"https://example.com/logos/companies/3"},{"id":4,"name":"Example Inc. 4","logo_url":"https://example.com/logos/companies/4"},{"id":5,"name":"Example Inc. 5","logo_url":"https://example.com/logos/companies/5"},{"id":6,"name":"Example Inc. 6","logo_url":"https://example.com/logos/companies/6"},{"id":7,"name":"Example Inc. 7","logo_url":"https://example.com/logos/companies/7"},{"id":8,"name":"Example Inc. 8","logo_url":"https://example.com/logos/companies/8"},{"id":9,"name":"Example Inc. 9","logo_url":"https://example.com/logos/companies/9"},{"id":10,"name":"Example Inc. 10","logo_url":"https://example.com/logos/companies/10"},{"id":11,"name":"Example Inc. 11","logo_url":"https://example.com/logos/companies/11"},{"id":12,"name":"Example Inc. 12","logo_url":"https://example.com/logos/companies/12"},{"id":13,"name":"Example Inc. 13","logo_url":"https://example.com/logos/companies/13"},{"id":14,"name":"Example Inc. 14","logo_url":"https://example.com/logos/companies/14"},{"id":15,"name":"Example Inc. 15","logo_url":"https://example.com/logos/companies/15"},{"id":16,"name":"Example Inc. 16","logo_url":"https://example.com/logos/companies/16"},{"id":17,"name":"Example Inc. 17","logo_url":"https://example.com/logos/companies/17"},{"id":18,"name":"Example Inc. 18","logo_url":"https://example.com/logos/companies/18"},{"id":19,"name":"Example Inc. 19","logo_url":"https://example.com/logos/companies/19"},{"id":20,"name":"Example Inc. 20","logo_url":"https://example.com/logos/companies/20"},{"id":21,"name":"Example Inc. 21","logo_url":"https://example.com/logos/companies/21"},{"id":22,"name":"Example Inc. 22","logo_url":"https://example.com/logos/companies/22"},{"id":23,"name":"Example Inc. 23","logo_url":"https://example.com/logos/companies/23"},{"id":24,"name":"Example Inc. 24","logo_url":"https://example.com/logos/companies/24"},{"id":25,"name":"Example Inc. 25","logo_url":"https://example.com/logos/companies/25"},{"id":26,"name":"Example Inc. 26","logo_url":"https://example.com/logos/companies/26"},{"id":27,"name":"Example Inc. 27","logo_url":"https://example.com/logos/companies/27"},{"id":28,"name":"Example Inc. 28","logo_url":"https://example.com/logos/companies/28"},{"id":29,"name":"Example Inc. 29","logo_url":"https://example.com/logos/companies/29"},{"id":30,"name":"Example Inc. 30","logo_url":"https://example.com/logos/companies/30"}]
In order to run the benchmarks, you'll need to have Ruby and Bundler installed on your system. Once you've installed all the dependencies with bundle install
, you can run the benchmarks with or without YJIT enabled.
-
Run the benchmarks without YJIT enabled
bundle exec ruby benchmark.rb
-
Run the benchmarks with YJIT enabled
bundle exec ruby --yjit benchmark.rb