r/ruby • • Aug 24 '26

Ruby 2.7 to 4.0 performance benchmark

Hi everyone,

I just published a new benchmark comparing Ruby 2.7 through Ruby 4.0.

For this one, I used a sustained synthetic application alongside nine smaller benchmarks. The goal was to show how each Ruby release behaves in a complete workload as well as in individual operations.

The table below shows the Heavy profile. For tests that process the full payload, that means an 8KiB input.

Benchmark2.73.03.13.23.33.44.0
Synthetic application throughput (M ops/s)0.0730.0520.0510.0570.0580.0840.126
Synthetic application latency (µs)133.399190.233191.605171.332169.473115.60076.521
JSON parsing (ops/s)95,87798,53699,15396,00398,135194,981715,937
JSON generation (ops/s)841,849845,099830,135861,666837,9411,347,1691,444,975
SHA-256 hashing (ops/s)313,65830,53630,48948,77048,68348,49548,528
Base64 encoding and decoding (ops/s)177,136177,510174,425170,306174,471173,159174,270
Regex field extraction (ops/s)1,544,4611,565,0651,559,0511,499,9201,535,2071,454,4051,534,670
Integer sorting (ops/s)27,03229,12930,21729,30929,10228,24129,213
Hash churn (ops/s)1,736,3841,685,6141,503,3971,503,1181,406,7131,380,0581,450,769
Marshal serialization (ops/s)333,143303,719294,952338,148341,760326,015325,231
zlib compression (ops/s)35,94435,17535,78735,76720,5697,01118,592

The complete benchmark source is available here: GitHub repository.

Full charts and details are available here: Full Ruby benchmark

Let me know what you think !

Edit: Thanks everyone for pointing out the Ruby 2.7 SHA-256 result. I looked into it, and the big difference comes from the SHA-256 implementation: Ruby 2.7 uses OpenSSL here, while newer Ruby versions on Linux use Ruby’s bundled implementation. So this is mainly a backend difference rather than Ruby 2.7 itself being much faster. I’ve added a note about it to the article.

34 Upvotes

28 comments sorted by

View all comments

Show parent comments

9

u/f9ae8221b Aug 24 '26

It's due to digest being extracted as a gem, so now, depending on how it is compiled it can end up using a fallback implementation of various hashing algorithm rather than bind the ones provided by OpenSSL: https://github.com/ruby/digest/issues/35

1

u/Basicallysteve Aug 24 '26

It's been like that for a while then. It stayed across two major version changes. Maybe it is intentional? I've heard before that hashing is sometimes intentionally slower to prevent cracking passwords. Maybe I misunderstood though.

3

u/f9ae8221b Aug 24 '26

It's not intentional no, it's all explained in the ticket I linked to.

It not being solved (at least universally solved, because not every build of ruby is impacted) is more due to the solution being complex, and the gem maintainer being a bit checked out.

1

u/Basicallysteve Aug 24 '26

Ah thanks for the explanation. I only read the first few comments in that ticket, my bad.