Как избежать копирования строк в Lua - PullRequest
2 голосов
/ 18 мая 2010

Скажем, у меня есть программа на C, которая хочет вызвать очень простую функцию Lua с двумя строками (скажем, два списка, разделенных запятыми, возвращая true, если списки пересекаются вообще, false если нет).

Очевидный способ сделать это - поместить их в стек с помощью lua_pushstring , который работает нормально, однако, из документа он выглядит как lua_pushstring, но делает копию строки для Lua для работы с .

Это означает, что для перехода к функции Lua потребуются две копии строк, которых я мог бы избежать, переписав функцию Lua в C. Есть ли способ упорядочить вещи так, чтобы существующие строки C могли быть повторно использованы на Lua стороны ради производительности (или стоило бы в любом случае стоимость strcpy бледнеет)?

Из моего исследования (мои первые несколько часов я серьезно смотрел на Lua), lite userdata выглядит как то, что я хочу, но в форме строки.

Ответы [ 2 ]

6 голосов
/ 18 мая 2010

Нет. Вы не можете запретить Lua делать копию строки, когда вы звоните lua_pushstring().

Причина: если только внутренний сборщик мусора не сможет освободить неиспользуемую память (например, ваши 2 входные строки).

Даже если вы используете легкую функциональность пользовательских данных (в данном случае это будет перебором), вам придется использовать lua_pushstring() позже, когда программа Lua запросит строку.

1 голос
/ 22 мая 2010

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

Примечание: Lua хранит строки только один раз, когда они вводятся. То есть: если у меня есть 1 строка, содержащая «Быстрая коричневая лиса перепрыгивает через ленивую собаку», и я толкаю ее в Lua, и других струнных объектов нет которые содержат эту строку, она создаст новую копию. Если, с другой стороны, я уже вставил его, вы просто получите указатель на эту первую строку, поэтому проверки на равенство довольно дешевы. Я думаю, что импорт этих строк может быть немного дорогим, если это делается с высокой частотой, однако сравнения, опять же, дешевы.

Я бы попробовал профилировать то, что вы внедряете, и посмотреть, соответствует ли производительность вашим ожиданиям.

Как документ Lua Performance Tips (который я рекомендую прочитать, если вы думаете о максимизации производительности с Lua), две максимумы программирования, связанные с оптимизацией:

Правило № 1: Не делайте этого.

Правило № 2: Пока не делайте этого. (только для экспертов)

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