Интересно, что еще никто не упомянул о разнице в типах JIT-компиляции, потому что Flash по-прежнему JIT-компилируется, и в большинстве современных браузеров, так же как и JavaScript, однако Flash - это язык со строгой типизацией, что означает есть целая область оптимизаций, которые он может выполнять (например, отправлять вызов метода напрямую (что JavaScript не может сделать)), чего не может сделать JavaScript, потому что он динамически типизирован. Вы можете заменить полное определение функции в JavaScript в любой момент, когда захотите, и это новое определение - то, что должно быть вызвано. (для JavaScript все еще возможно сделать косвенный вызов, который не будет намного более дорогим, хотя) Доступ к полю на поле на самом деле является лучшим примером, чем вызов метода, потому что JavaScript не может даже сделать это косвенно,
Другое отличие в производительности, как уже упоминалось, GC. Я подозреваю (я не проверял), что большинство браузеров используют GC для подсчета ссылок (поскольку вся память, выделенная GC для страницы, может быть освобождена при выходе из страницы, это фактически одно из лучших мест для использования GC для подсчета ссылок ) или консервативное сканирование ГК (например, Бёма). Последний может быть значительно медленнее первого, если он не реализован правильно. (Boehm - пример правильной реализации) С другой стороны, Flash использует точный GC (намного проще сделать в строго типизированной системе). Поскольку Flash использует точный GC, у него нет накладных расходов на подсчет ссылок во время выполнения. (который не огромен, но все еще существует) Хорошим примером точного GC является SGen Mono, который также сжимает кучу.
Затем следует тот факт, что JavaScript не был разработан с учетом анимации. (как уже упоминалось) Насколько мне известно, ни один браузер не будет генерировать инструкции в стиле SSE для циклов анимации, тогда как основные функции рендеринга во Flash, вероятно, были оптимизированы вручную для достижения максимальной производительности. (в некоторых местах пишется в сыром виде)
В общем, все сводится к тому, что динамический язык всегда будет медленнее, чем статически типизированный, если он должен быть скомпилирован своевременно, чтобы пользователь не жаловался на его медлительность.