Pull to refresh

Lua vs. JavaScript

Algorithms *
SmallPic

Недавно я написал пост о том как сделать рейтрейсер. Код рейтрейсера тогда был написан на 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 по три луча на пиксель. Вот эта сцена:

BigImage

Результаты следующие (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
Tags:
Hubs:
Total votes 63: ↑59 and ↓4 +55
Views 15K
Comments Comments 91