Na primeira aproximação, há uma diferença na "localidade" do acesso à memória, quando um programa apenas avança no heap no estilo CPS, em vez do crescimento e encolhimento tradicionais da pilha. Observe também que o CPS sempre precisará do GC para recuperar seus dados aparentemente locais colocados no heap. Somente essas observações seriam adequadas 10 ou 20 anos atrás, quando o hardware era muito mais simples do que hoje.
Eu mesmo não sou um guru de hardware nem de compilador; portanto, como segunda aproximação, aqui estão algumas razões concretas para o aprox. fator 100 observado em Isabelle / HOL:
Perda de desempenho básico de acordo com a "primeira aproximação" acima.
O gerenciamento de heap SML / NJ e o GC têm problemas sérios para escalar além de várias dezenas de MB; Isabelle agora usa 100-1000 MB rotineiramente, às vezes vários GB.
A compilação SML / NJ é muito lenta - isso pode não ter relação alguma (observe que Isabelle / HOL alterna a compilação de tempo de execução e o código de execução).
O SML / NJ não possui multithreading nativo - não totalmente independente, pois o CPS foi anunciado como "role seus próprios threads no espaço do usuário sem pilhas separadas".
A correlação de heap e threads também é discutida no artigo de Morriset / Tolmach PPOPP 1993 "Procs and Locks: A Portable Multiprocessing Platform for ML Standard of New Jersey" ( CiteSeerX ). Nota: O PDF no CiteSeerX está para trás, 1 em vez de 1-10.