Мне нужно выполнить следующий код:
local filename = dir .. "/" .. base
тысячи раз в цикле (это рекурсия, которая печатает дерево каталогов).
Теперь я задаюсь вопросом, объединяет ли Lua 3 строки (dir, "/", base) за один раз (т.е. выделяя строку, достаточно длинную, чтобы удерживать их общую длину), или делает это неэффективным способом, делая это внутренне в два этапа:
local filename = (dir .. "/") -- step1
.. base -- step2
Этот последний способ будет неэффективным по памяти, потому что вместо строки выделяются две строки.
Мне очень не нравятся циклы процессора: я в основном забочусь о потреблении памяти.
Наконец, позвольте мне обобщить вопрос:
Lua выделяет только одну строку или 4, когда она выполняет следующий код?
local result = str1 .. str2 .. str3 .. str4 .. str5
Кстати, я знаю, что могу сделать:
local filename = string.format("%s/%s", dir, base)
Но мне еще предстоит сравнить его (память и процессор).
(Кстати, я знаю о таблице: concat(). У этого есть дополнительные накладные расходы на создание таблицы, поэтому я думаю, что это не будет полезно во всех случаях использования.)
Бонусный вопрос:
В случае, если Lua не оптимизирует оператор "..", было бы неплохо определить функцию C для конкатенации строк, например. utils.concat(dir, "/", base, ".", extension)
?