Накладные расходы на копирование функций lua - PullRequest
1 голос
/ 08 сентября 2011

У меня много lua-скриптов с тем же именем, которое используется для имени функции (предназначено для «точки входа»), и я хочу их запустить.Но я хочу сделать это как можно быстрее.

После некоторого просмотра / поиска / анализа у меня есть два решения.

1. У меня есть главный lua_State.Я загружаю все необходимые данные и свои собственные библиотеки / функции "в".Затем я выполняю lua_dump () функцию lua_State текущего lua-скрипта (с использованием связанного списка для контейнера chunck), затем я выполняю lua_load () для основного lua_State и затем lua_call () для основного lua_State.С этим решением мне не нужно загружать все библиотеки для всех скриптов.Таким образом, основным lua_State является «среда».:)

2. Я просто делаю загрузку библиотек для всех lua_State.И затем lua_call () им.

Вопрос будет таким: Является ли даже первый логически правильным?И если да, какой из них вы бы использовали?Есть ли лучшее решение?

Спасибо, и извините за мой английский.

(И если первое действительно правильно, есть ли какая-то неоправданная возможность оптимизации?)

Ответы [ 2 ]

2 голосов
/ 08 сентября 2011

Как вы говорите, я не понимаю, почему вы хотите больше, чем 1 Lua State.Если у вас есть только одно состояние Lua, все накладные расходы будут загружать библиотеки (один раз), а затем загружать функции из запущенных вами скриптов (один раз, если вам не нужно «обновить» их из файла).Так что просто имейте 1 состояние и dofile сценарии.

Если вам действительно нужны эти множественные lua_States, вы можете загрузить только те библиотеки, которые вам нужны, как объяснено в Справочном руководстве по Lua, в параграфечуть выше 5.1

Есть также хорошая свободно доступная глава по оптимизации кода Lua в Lua Gems Book .

0 голосов
/ 09 ноября 2012

Я недавно сделал нечто подобное и решил использовать один lua_State. Я специально загрузил каждый файл скрипта в его собственную среду с помощью значения _ENV (генерируя новую среду для каждого в качестве копии глобальной среды). Таким образом, имена не будут конфликтовать, и я считаю, что вы можете запустить несколько сценариев параллельно, если вам это нужно по какой-либо причине.

Это работает для моих целей, так как мне нужно получить доступ ко всем функциям во всех загруженных скриптах в основном в произвольном порядке и в любое время, но если все, что вам нужно, это запустить их один раз, тогда вы можете просто загрузить и выполнить их последовательно в одном и том же lua_State.

Редактировать: Я заметил, что на самом деле упустил суть вопроса. Ответ: использование одного lua_State будет быстрее, если вам нужно загрузить какие-либо стандартные библиотеки (заметные накладные расходы). Если вы запускаете каждый скрипт только один раз, когда вам не нужно использовать lua_dump/lua_load, просто сделайте что-то вроде luaL_dofile, затем lua_pcall в функции ввода, а затем продолжайте (т.е. загружайте следующий файл).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...