避免在Lua中进行字符串复制 在Lua中,当需要将一个字符串赋值给一个变量或传递给一个函数时,这个字符串通常会被复制一次或多次。这可能会导致性能问题,特别是在处理大量字符串时。 为了避免这种情况,Lua提供了一些技巧来避免字符串复制。例如,可以使用字符串连接符“..”来将两个字符串连接起来,而不是使用拼接的方式。还可以使用数字键来访问字符串中的单个字符,而不是使用字符串函数来提取子串。 此外,如果在代码中需要频繁处理相同的字符串,可以使用字符串缓存来避免字符串复制。这可以通过将字符串作为键,在一个Lua表中存储相应的值来实现。 总之,避免在Lua中进行字符串复制可以提高代码的性能和效率。

假设我有一个 C 程序,它想调用一个非常简单的 Lua 函数,该函数有两个字符串参数(假设为两个逗号分隔的列表),如果这些列表有任何交集,则返回 true,否则返回 false。

显然的方法是使用 lua_pushstring 将它们推到堆栈上,这样可以正常工作,但是从文档中看,lua_pushstring 会为 Lua 创建一个字符串副本。

这意味着要跨越到 Lua 函数将需要两个字符串副本,我可以通过在 C 中重新编写 Lua 函数来避免这种情况。是否有任何方法可以安排事情,以便现有的 C 字符串可以在性能方面重用于 Lua 端(或者 strcpy 成本无论如何都微不足道)?

目前为止,我调查了一下(我第一次认真研究 Lua,已经几个小时了),lite userdata 似乎是我想要的类型,但是以字符串的形式。

原文链接 https://stackoverflow.com/questions/2855475

点赞
stackoverflow用户50890
stackoverflow用户50890

No. You cannot forbid Lua making a copy of the string when you call lua_pushstring().

理由:如果不这样做,内部垃圾回收器将无法释放未使用的内存(如您的两个输入字符串)。

即使您使用轻量级用户数据功能(在这种情况下过于复杂),当 Lua 程序请求字符串时,您仍必须使用 lua_pushstring()

2010-05-18 08:49:29
stackoverflow用户105950
stackoverflow用户105950

嗯.. 您可以编写一些 C 函数,以使工作在 C 端完成,但正如其他答案所指出的那样,您可能仍然要将字符串或其中的一些部分推入到 Lua 中。

值得注意的是:Lua只在字符串被导入时执行一次存储。例如:如果我有一个包含“快速棕色狐狸跳过懒狗”的字符串,并将其推入 Lua 中,并且没有其他包含该字符串的字符串对象,那么它将创建一个新副本。另一方面,如果我已经插入了它,您将只获得对第一个字符串的指针,因此相等性检查是相当便宜的。如果在高频率下进行此操作,则导入这些字符串可能会有点昂贵。但是,再次进行比较是便宜的。

我建议您尝试对您正在实现的内容进行分析,并查看性能是否符合您的期望。

正如《Lua性能技巧》所述(如果您考虑使用Lua最大化性能,则建议阅读),与优化相关的两个编程重点是:

规则#1:不要这么做。

规则#2:暂时不要这么做(仅供专家)。

2010-05-22 00:10:40