Ruby 2.4 Performance Looking Good
Benchmarking Ruby 2.3.3 against Ruby 2.4.0
There are some articles highlighting new features of the upcoming Ruby 2.4. I decided to run a basic benchmark comparing Ruby 2.4 to Ruby 2.3.3 and was pleasantly surprised.
A few weeks ago I wrote about HexaPDF’s performance by running a benchmark that compares HexaPDF to various other tools in regards to optimizing the size of a PDF file.
However, with this real-world benchmark I cannot only compare HexaPDF to other tools but also to itself on other Ruby versions. Note that this is neither an artificial benchmark nor a micro-benchmark since PDF files are parsed, their in-memory representation modified and then serialized again by the HexaPDF library. This involves a lot of string to Ruby object conversion and vice versa.
Here are the results:
|----------------------------------------------||-----------------------|
| | Ruby 2.3.3p222 || Ruby 2.4.0preview3 |
|----------------------------------------------||-----------------------|
| a.pdf (53,056) | Time | Memory || Time | Memory |
|----------------------------------------------||-----------------------|
| hexapdf | 189ms | 14,992KiB || 222ms | 13,396KiB |
| hexapdf C | 152ms | 14,912KiB || 137ms | 13,260KiB |
| hexapdf CS | 154ms | 15,920KiB || 152ms | 14,432KiB |
| hexapdf CSP | 158ms | 16,600KiB || 176ms | 15,124KiB |
|----------------------------------------------||-----------------------|
|----------------------------------------------||-----------------------|
| b.pdf (11,520,218) | Time | Memory || Time | Memory |
|----------------------------------------------||-----------------------|
| hexapdf | 1,188ms | 31,356KiB || 900ms | 32,512KiB |
| hexapdf C | 1,055ms | 33,460KiB || 1,025ms | 33,480KiB |
| hexapdf CS | 1,120ms | 34,512KiB || 1,062ms | 35,396KiB |
| hexapdf CSP | 9,469ms | 84,896KiB || 8,891ms | 79,924KiB |
|----------------------------------------------||-----------------------|
|----------------------------------------------||-----------------------|
| c.pdf (14,399,980) | Time | Memory || Time | Memory |
|----------------------------------------------||-----------------------|
| hexapdf | 2,286ms | 44,840KiB || 2,020ms | 39,808KiB |
| hexapdf C | 2,201ms | 49,940KiB || 2,063ms | 39,908KiB |
| hexapdf CS | 2,354ms | 53,076KiB || 2,211ms | 46,944KiB |
| hexapdf CSP | 10,148ms | 104,680KiB || 9,889ms | 97,088KiB |
|----------------------------------------------||-----------------------|
|----------------------------------------------||-----------------------|
| d.pdf (8,107,348) | Time | Memory || Time | Memory |
|----------------------------------------------||-----------------------|
| hexapdf | 5,834ms | 104,844KiB || 5,113ms | 65,068KiB |
| hexapdf C | 5,762ms | 90,940KiB || 5,045ms | 62,256KiB |
| hexapdf CS | 6,254ms | 84,860KiB || 5,692ms | 71,036KiB |
| hexapdf CSP | 6,327ms | 98,496KiB || 5,798ms | 102,684KiB |
|----------------------------------------------||-----------------------|
|----------------------------------------------||-----------------------|
| e.pdf (21,788,087) | Time | Memory || Time | Memory |
|----------------------------------------------||-----------------------|
| hexapdf | 1,001ms | 53,352KiB || 811ms | 47,156KiB |
| hexapdf C | 1,111ms | 107,264KiB || 1,065ms | 105,084KiB |
| hexapdf CS | 1,152ms | 108,276KiB || 1,069ms | 101,172KiB |
| hexapdf CSP | 35,771ms | 186,952KiB || 37,525ms | 202,364KiB |
|----------------------------------------------||-----------------------|
|----------------------------------------------||-----------------------|
| f.pdf (154,752,614) | Time | Memory || Time | Memory |
|----------------------------------------------||-----------------------|
| hexapdf | 60,355ms | 606,736KiB || 55,118ms | 484,672KiB |
| hexapdf C | 64,876ms | 592,752KiB || 58,753ms | 532,488KiB |
| hexapdf CS | 69,811ms | 716,004KiB || 63,725ms | 653,232KiB |
| ERR hexapdf CSP | 0ms | 0KiB || 0ms | 0KiB |
|----------------------------------------------||-----------------------|
When looking at the time, especially for f.pdf
, it is clear that Ruby 2.4 is about 9% faster
than 2.3.3 (ignore the a.pdf
case since this is a very small file where the initialization cost
distorts the results)!
To be honest, I expected Ruby 2.4 to be faster because of the Ruby 3x3 initiative. However, what I didn’t expect was that the memory consumption is also reduced by about 10%!
Props to the Ruby core team – I’m looking forward to using Ruby 2.4!