I used to think it odd that JITs rarely beat AOT because a JIT has more info. Turns out JITs can't afford powerful but slow optimisations.
miniblog.
Related Posts
It's strange how AOT compilers usually have different modes for optimising time or space usage, but JITs rarely have modes like "prefer fast startup".
The vast majority of JITs seem to focus on runtime of hot code after warming up.
This comparison of OpenSmalltalkVM and TruffleSqueak is a really effective demonstration of JITs.
TruffleSqueak initially has a lower framerate, but eventually exceeds OpenSmalltalkVM. As soon as the GUI is used (at 3:30), the framerate drops again!
JITs are blackboxes that can make it hard to reason about performance in production: