Without types everything is a pointer (boxing), and when you actually need the value you need to resolve (dereference).
This is almost always cache miss.
If the collection is polymorphic it's even worse because you dereference to access the dispatch table which then redirects you to the real value.
Furthermore, each variable will need heap allocation and tracking, stressing the garbage collector and the underlying allocator (unless you preallocate big chunks like Java).
The "HashLink in-depth" blog post talks about this, an excerpt:
> [...] Neko is very slow. The main reason for this is that it's dynamically typed. So every "value" in the VM can be either an Int, a Float, a Bool, some Bytes, an Array, a Function or Object, etc. And because this value needs to be recognized at run-time, its type together with its data need to be stored in the memory. [...]
This is almost always cache miss.
If the collection is polymorphic it's even worse because you dereference to access the dispatch table which then redirects you to the real value.
Furthermore, each variable will need heap allocation and tracking, stressing the garbage collector and the underlying allocator (unless you preallocate big chunks like Java).