The author then appears to draw the wrong conclusion:
> What I find most interesting about the changes I’ve made to code generation in P2, is that the currently compiled code is more than twice as fast as it was when P2 first came out, which just goes to show than in fact Ruby is not slow, it is actually quite fast, you just need to know how to write fast code! (And I guess this is true for any programming language.)
I love Ruby, but it is still a slow language on most benchmarks. That's ok. For most webapps, the bottleneck is not execution-time performance, it's the speed and joy of writing the code. Functionality that never got built because it was too annoying to build is infinitely slow. But there's no point in pretending Ruby, compared to, say, Rust, isn't a slow-as-molasses execution environment. It is. It's ok. It's optimised for developer happiness, not speed.
And yes, even so, you can write slow Ruby code and fast Ruby code. Again, which one makes sense is contextual. But it doesn't make the point that "Ruby isn't slow."
But in my experience it does. I've built platforms in Ruby that handle north of 1K reqs/sec with bursts of 10K reqs/sec on moderate hardware, without needing to setup a whole cluster of machines that crunch on poorly-performing code.
From my experience, getting the average execution time per render from say 0.1ms to 0.01ms, and especially reducing allocations and GC pressure has a big effect on 99% percentiles, and consequently on the cost of compute.
Saying because we use Ruby we don't care if it's slow or not is in a way dismissing it as a viable platform for writing reliable software (because performance is part of reliability).
To me, you can use Ruby to create systems that have very good performance characteristics, and still benefit from developer happiness. The two are not contradictory.
Not OP, but to a point I think this is pretty much true...
We currently have decent performance so it works out well for most use cases, but if Ruby were to be slower, we could probably cover that issue with infra, caching or other means. As we already do in many cases.
It would be a pain point, but in comparison increasing developer happiness or the whole product dev experience is IMHO a lot harder. Perfs would need to be abysmally bad to change that balance.
Parralelize the build, buy more resource for the CI. It might cost more but it will be "saving lifes" after all, right ?
The question is usually whether those scripts would have existed if it wasn't for Python. I assume if it was trivial to rewrite them you'd do it in 2 hours and go on with your life.
The tools possibly wouldn’t exist, but there are options now that provide better ergonomics and are not slow.
I assume something will done at some point, but IMHO it's one of these very nice problems to have, as there is a working version that will only be replaced by something better, and only if it's worth it.
Jean Boussier wrote this execellent examination of CPU bound Rails application and why making use of multi-processes is probably a good idea.
Even if you're not using CPU bound it's still daft to leave performance on the table you don't need to.
For the most part if something is a bit slower than it needs to be it still makes more sense to take the obvious bottle necks out before you rewrite the whole system in another language. Especially with YJIT and forcoming ZJIT availible.
1. https://byroot.github.io/ruby/performance/2025/01/23/the-myt...
I would add to this commentary that there are a number of things you can do in Rails to speed it up. For instance, ActionController::Metal
Python gives you other interesting ways of going fast (a lot of high performance plugins for numerics, Cython, and so on), while Ruby is a higher level more expressive language IMO, so you have more ways to shoot yourself in the foot more powerfully.
As long as you only use ruby as glue code for c(++) extensions it’s pretty fast.
I don't recall exactly where I read it, but I think was a while ago when they announced one of the newest JIT engines.
More Ruby code means more room for optimizations that the team can identify and add to the compiler
Another way of saying that is "as long as you don't use it it won't slow you down".
Just the thought of comparing Rubys execution speed with Rust is pointless. They are completely different languages and has their own use cases, if you care about performance, Ruby is not it. I don't think the author intended to oppose that either
Edit: Another honorable mention, look at Delphi in its prime, millions of lines of code, compiles in under 5 minutes.
To get faster this, you need to get out your profiling tools and your notebook.
Builder::XmlMarkup and strings are significantly more flexible and have many optimization points. (E.g. not escaping numbers.) They have the potential to be an order of magnitude faster. But you’ll be using that notebook to diagram where everything goes.
Yo dawg, I heard yo and yo dawg like yo-yos so I put yo dawg in yo yo-yo so yo can yo-yo yo dawg while yo dawg yo-yos, dawg.