Benchmarking Ruby 3 in PDF generation

Ruby 3 JIT was optimized against CPU-intensive demo, which left Rails enthusiasts left out. But what about tasks in the middle of both? Here’s my latest benchmark on Ruby 3 JIT in generating PDF files with Prawn.

A little over a year ago, I created a PDF generation benchmark to help Takashi optimize the upcoming Ruby 3 JIT. I blogged about how to make such a benchmark, and my results for Ruby 2.5, 2.6, and 2.6 –jit.

The JIT wasn’t very successful for this task, but it was very early. So, what about now, that Ruby 3 is out?

My numbers are again for generating a PDF invoice with InvoicePrinter, this time for version 2.1 that supports Ruby 3.

Here are CPU numbers:

Comparison:
                           render

/home/strzibny/.rubies/ruby-2.7.0/bin/ruby:        64.6 i/s
/home/strzibny/.rubies/ruby-3.0.0/bin/ruby:        61.8 i/s - 1.05x  slower
/home/strzibny/.rubies/ruby-3.0.0/bin/ruby --jit:  56.3 i/s - 1.15x  slower

/home/strzibny/.rubies/ruby-2.7.0/bin/ruby:        64.9 i/s
/home/strzibny/.rubies/ruby-3.0.0/bin/ruby:        62.0 i/s - 1.05x  slower
/home/strzibny/.rubies/ruby-3.0.0/bin/ruby --jit:  54.5 i/s - 1.19x  slower

As you can see, we are not there yet. Ruby 3.0 is up to 5% slower than 2.7, and Ruby 3 JIT up to 19% slower.

And numbers for memory:

Comparison:
                           render

/home/strzibny/.rubies/ruby-3.0.0/bin/ruby:  23896000.0 bytes
/home/strzibny/.rubies/ruby-2.7.0/bin/ruby:  25920000.0 bytes - 1.08x  larger
/home/strzibny/.rubies/ruby-3.0.0/bin/ruby --jit:  79876000.0 bytes - 3.34x  larger

/home/strzibny/.rubies/ruby-3.0.0/bin/ruby:  24140000.0 bytes
/home/strzibny/.rubies/ruby-2.7.0/bin/ruby:  26108000.0 bytes - 1.08x  larger
/home/strzibny/.rubies/ruby-3.0.0/bin/ruby --jit:  79916000.0 bytes - 3.31x  larger

It seems we are at least getting better RAM consumption in Ruby 3.0, Ruby 2.7 takes up to 8% more memory.

As expected, Ruby JIT takes a lot more memory – more than three times. I wonder if somebody runs the Ruby 3.0 JIT in some real workloads because I cannot see myself using the JIT any time soon.

← BUY THE PRE-RELEASE

I am writing a complete guide on web application deployment. Ruby with Puma, Python with Gunicorn, NGINX, PostgreSQL, Redis, networking, processes, systemd, backups, and all your usual suspects. Final release soon!

More →