Czy Lua optymalizuje operatora „..”?
Muszę wykonać następujący kod:
local filename = dir .. "/" .. base
tysiące razy w pętli (jest to rekursja, która drukuje drzewo katalogów).
Zastanawiam się teraz, czy Lua łączy 3 ciągi znaków (katalog, „/”, baza) za jednym razem (tj. Przez przydzielenie łańcucha wystarczająco długo, aby pomieścić ich całkowitą długość) lub czy robi to w sposób nieefektywny, wykonując to wewnętrznie dwa kroki:
local filename = (dir .. "/") -- step1
.. base -- step2
Ten ostatni sposób byłby nieefektywny pod względem pamięci, ponieważ zamiast jednego przydzielane są dwa ciągi.
Nie obchodzą mnie cykle procesora: zależy mi głównie na zużyciu pamięci.
Na koniec pozwól mi uogólnić pytanie:
Czy Lua przydziela tylko jeden ciąg, lub 4, gdy wykonuje następujący kod?
local result = str1 .. str2 .. str3 .. str4 .. str5
BTW, wiem, że mogę to zrobić:
local filename = string.format("%s/%s", dir, base)
Ale muszę to jeszcze sprawdzić (pamięć i procesor).
(BTW, wiem o tabeli: concat (). Ma to dodatkowy narzut tworzenia tabeli, więc myślę, że nie będzie to korzystne we wszystkich przypadkach użycia.)
Pytanie dodatkowe:
Gdyby Lua nie zoptymalizował operatora „..”, czy dobrym pomysłem byłoby zdefiniowanie funkcji C do łączenia łańcuchów, np.utils.concat(dir, "/", base, ".", extension)
?