Должна ли быть реализована функция "no op" в Lua или в C?

У меня есть следующая функция, которая просто возвращает свой строковый аргумент:

function N_(s)
  return s
end

Вы можете узнать это имя функции из gettext. Это маркировка только для экстрактора.pot.

Будет ли эффективнее реализовать N_() в C или в Lua?

Можете ли вы дать мне правило?

Другой вопрос:

Допустим, у меня есть функция немного сложнее:

function Z_(s)
  return dict[s] or s
end

Будет ли эффективнее реализовать Z_() в C или в Lua?

(Я буду вызывать N_() и Z_() из кода Lua, а не из кода C).

2 ответа

Решение

Функции, реализованные в Lua, которые не сильно нагружают процессор, скорее всего, будут более эффективными, чем функции в C, если вы проводите большую часть своего времени в Lua. Это особенно верно, если вы в конечном итоге будете использовать LuaJIT в будущем. Компилятор всегда сможет вывести больше информации из вашей функции, если она написана на языке, чем если бы это была какая-то непонятная функция C, о которой он ничего не знает, и ему не нужно совершать столько же прыжков в разных контекстах.

Проблема с реализацией Z_ в C то, что вы также должны были бы реализовать dict в C, где Lua уже имеет такую ​​функциональность на месте. Таким образом, это зависит от того, нужна ли вам какая-то специально оптимизированная хэш-карта, может быть, C будет лучше.


Если вас беспокоит эффективность вызова функций, почему бы просто не кэшировать результаты?

-- instead of doing:
print(Z_('Hello world! My name is %1!', 'Lua'))
-- perhaps do this:
local greeting = Z_('Hello world! My name is %1!', 'Lua')
print(greeting)
-- reuse greeting at some later time.

Конечно, ваш Z_ функция еще не выглядит так, как будто она требует подстановок, но я предполагаю, что это возможно позже. Однако, если вам никогда не нужны замены, вы можете также составить таблицу следующим образом:

local Z = setmetatable({}, {__index = function(t,k) return k end})
Z['greetings'] = 'Hello world!'
print(Z['greetings']) -- Hello world!
print(Z['goodbye']) -- goodbye

Эта таблица имеет __index метаметод, который возвращает используемый ключ, если в таблице нет такой записи.

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

Как правило, пишите все это на Lua, если только это не длинная задача, для которой существует функция библиотеки C.

Имейте в виду, что вы, вероятно, будете гораздо более продуктивно писать код на Lua, чем код на C Таким образом, вы скорее всего поймете это правильно в Lua. Производительность, вероятно, будет достаточно хорошей.

Во всех случаях YMMV и так измеряют сами.

Другие вопросы по тегам