避免在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
嗯.. 您可以编写一些 C 函数,以使工作在 C 端完成,但正如其他答案所指出的那样,您可能仍然要将字符串或其中的一些部分推入到 Lua 中。
值得注意的是:Lua只在字符串被导入时执行一次存储。例如:如果我有一个包含“快速棕色狐狸跳过懒狗”的字符串,并将其推入 Lua 中,并且没有其他包含该字符串的字符串对象,那么它将创建一个新副本。另一方面,如果我已经插入了它,您将只获得对第一个字符串的指针,因此相等性检查是相当便宜的。如果在高频率下进行此操作,则导入这些字符串可能会有点昂贵。但是,再次进行比较是便宜的。
我建议您尝试对您正在实现的内容进行分析,并查看性能是否符合您的期望。
正如《Lua性能技巧》所述(如果您考虑使用Lua最大化性能,则建议阅读),与优化相关的两个编程重点是:
规则#1:不要这么做。
规则#2:暂时不要这么做(仅供专家)。
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
理由:如果不这样做,内部垃圾回收器将无法释放未使用的内存(如您的两个输入字符串)。
即使您使用轻量级用户数据功能(在这种情况下过于复杂),当 Lua 程序请求字符串时,您仍必须使用
lua_pushstring()
。