【发布时间】:2013-10-08 22:59:35
【问题描述】:
我必须执行以下代码:
local filename = dir .. "/" .. base
循环数千次(这是一个打印目录树的递归)。
现在,我想知道 Lua 是否一次性连接了 3 个字符串(dir、“/”、base)(即,通过分配一个足够长的字符串来保存它们的总长度),或者它是否这样做是低效的内部分两步:
local filename = (dir .. "/") -- step1
.. base -- step2
最后一种方式在内存方面效率低下,因为分配了两个字符串而不是一个。
我不太关心 CPU 周期:我主要关心内存消耗。
最后,让我概括一下这个问题:
Lua 在执行下面的代码时是只分配一个字符串,还是 4 个?
local result = str1 .. str2 .. str3 .. str4 .. str5
顺便说一句,我知道我可以做到:
local filename = string.format("%s/%s", dir, base)
但我尚未对其进行基准测试(内存和 CPU 方面)。
(顺便说一句,我知道 table:concat()。这会增加创建表的开销,所以我想它不会在所有用例中都有用。)
一个额外的问题:
如果 Lua 没有优化 ".." 运算符,定义一个用于连接字符串的 C 函数是否是个好主意,例如utils.concat(dir, "/", base, ".", extension)?
【问题讨论】:
-
如果内存是您唯一关心的问题,请不要担心。这只是一个暂时的峰值,在第二次连接完成后,临时字符串将被快速收集。
-
table.concat{dir, "/", base, ".", extension} -
@Eric 你确定我们可以在字符串上使用 table.concat 吗?
-
@SianLerkLau:仔细看——那些是大括号。 Lua 允许您跳过某些函数调用的括号
标签: c string performance lua