
Недавно я написал пост о том как сделать рейтрейсер. Код рейтрейсера тогда был написан на JavaScript. Мне стало интересно, как с этой же задачей справится Lua, а именно LuaJIT 2.0. Ниже результаты сравнения.
Участие принимали Chrome 9.0 Beta, Opera 11.01, Firefox 4.0 Beta 9, Explorer 9 Beta и LuaJIT 2.0 Beta 5. Все пять участников рендерили одну и ту же сцену на экран 1000x1000 по три луча на пиксель. Вот эта сцена:

Результаты следующие (RPS означает «число лучей в секунду»):
Chrome | 20,400 RPS |
Opera | 15,700 RPS |
Firefox | 9,300 RPS |
Explorer | 9,000 RPS |
LuaJIT | 5,000 RPS |
Неожиданный результат: LuaJIT оказался самым медленным, причём с отрывом от остальных участников.
Как заметил FreeLancer, можно изменить настройки сборщика мусора в Lua. Если дописать в начало кода строчку collectgarbage('setpause', 2000) то сборщик мусора будет редко прерывать работу рейтрейсера и скорость вырастет до 25,000 RPS, но пиковое потребление памяти вырастет до 1,5 гигабайт. Chrome «съел» всего лишь 150 Мб когда показал результат 20,400 RPS.
Здесь можно скачать код примеров: JavaScript и LuaJIT. Код JS и Lua идентичен, за исключением мелких синтаксических различий. Чтобы запустить пример на Lua у себя, нужно сделать себе файл luajit.exe (взять с сайта LuaJIT готовый или скомпилировать из исходников) и выполнить в командной строке
luajit main.lua