I'd say that GHC probably has the best codegen out of any functional language compiler and it also stacks up pretty well against imperative languages, too.
What I mean by that is:
- GHC has a really high performance ceiling
- Most performance complaints about Haskell are actually complaints against specific packages or types (e.g.
base/[]/String)
That doesn't mean that it is necessarily easy to get great performance (again: bad defaults in base), but as a first approximation if you just stick to certain Haskell packages (e.g. bytestring / text / containers / unordered-containers / vector) then you'll get amazing performance.
People really don't appreciate how much GHC actually does, especially considering that naive Haskell codegen would be very slow (naive laziness would translate every single expression to a heap allocated thunk for example)
