I learned a bit of Haskell at university back in the late 90s. At the time, though performance was adequate and much better than one would expect for such a high-level language, it still was nothing to write home about.
Things have changed. Haskell (GHC) today has great performance, often not far from C/C++. So, what exactly was changed in the compiler that has contributed the most to this improvement? I am aware of several techniques often used, such as better unboxing and strictness analysis. What I would like to have is some rough idea about the quantitative contribution that each of these techniques has brought to the overall performance improvement.
If you prefer, the question can also be framed in the following terms: consider the not-so-great performance of GHC Haskell in the mid 90s. What would be the top 5 areas to improve to bring performance closer to that of 2013 GHC Haskell?