При першому наближенні є різниця в "локальності" доступу до пам'яті, коли програма просто запускається вперед на купі в стилі CPS, замість традиційного росту та скорочення стека. Також зауважте, що CPS завжди знадобиться GC для відновлення ваших, здавалося б, локальних даних, розміщених у купі. Ці спостереження були б адекватними 10 чи 20 років тому, коли обладнання було набагато простішим, ніж сьогодні.
Я сам не є гуру апаратних засобів, ні компілятора, тому, як друге наближення, ось деякі конкретні причини прибл. коефіцієнт 100, помічений в Ізабелі / HOL:
Основні втрати продуктивності відповідно до "першого наближення" вище.
Управління купами SML / NJ та GC мають серйозні проблеми, що перевищують кілька десятків МБ; Зараз Isabelle використовує 100-1000 МБ звичайно, іноді кілька ГБ.
Компіляція SML / NJ дуже повільна - це може бути абсолютно не пов’язано (зауважте, що Isabelle / HOL чергує компіляцію виконання та запущений код).
У SML / NJ бракує рідної багатопотоковості - не повністю пов'язаної між собою, оскільки CPS рекламувались як "розкачати власні потоки в просторі користувача без окремих стеків".
Співвідношення купи та ниток також обговорюється у статті Morriset / Tolmach PPOPP 1993 "Програми та замки: Портативна багатопроцесорна платформа для стандартних ML Нью-Джерсі" ( CiteSeerX ) Примітка: PDF у CiteSeerX є назад, сторінки з 10- 1 замість 1-10.