In a statically typed language, the compiler knows the data-type of a variable and how to represent that.
In a dynamically-typed language, it has to keep flag describing the actual type of the value of the variable, and the program has to perform a data-dependent branch on that value each time it manipulates a variable. It also has to look up all methods and operators on it.
The knock-on effect of this on branching and data locality is lethal to general purpose run time performance.
That’s why the dynamic language JIT benchmarks emphasise...