原生 Lua 中高效的可变字节数组

发布于 2024-10-04 22:01:08 字数 388 浏览 3 评论 0原文

我正在尝试在本机 Lua 中高效实现 LZ77 解码器(即没有 C 库,并且不依赖于非核心 Lua 库) - 请参阅 liblzg

对于加载和解析二进制文件,Lua 字符串可以完美地工作,并且具有良好的性能(例如使用 s:byte(k) 方法)。然而,对于创建解码的输出数据,字符串并不是非常理想,因为它们是不可变的,并且当输出变大时,字符串连接往往会花费大量时间。

解码器必须能够:

  • 一次向输出附加一个字节(最多数百万次)
  • 从输出缓冲区读取(或多或少随机访问)

最佳选项是什么?输出数据的大小事先已知,因此可以预先分配。

I am trying to make an efficient implementation of an LZ77 decoder in native Lua (i.e. no C library, and no dependencies on non-core Lua libraries) - see liblzg.

For loading and parsing the binary file, a Lua string works perfectly, and with good performance (e.g. using the s:byte(k) method). However, for creating the decoded output data, strings are not very optimal, since they are immutable, and string concatenation tends to take lots and lots of time when the output becomes large.

The decoder must be able to:

  • Append one byte to the output at a time (up to millions of times)
  • Read (more or less random access) from the output buffer

What are the best options? The size of the output data is known before hand, so it can be pre-allocated.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

满身野味 2024-10-11 22:01:08

避免字符串串联:将输出字符串保存到表中,并将所有字符串写入最后。如果您担心桌子变得太大,请定期冲洗它。
请参阅http://www.lua.org/pil/11.6.html

Avoid string concatenation: save output strings to a table and write all strings in it at the end. If you're concerned about the table getting too big, flush it periodically.
See http://www.lua.org/pil/11.6.html

濫情▎り 2024-10-11 22:01:08

听起来像是 table.concat 的完美工作
你的输出只是一个字节表。

当您需要复制时,您可以像平常复制表格一样进行操作。
例如:

for i=#output-5,9 do output[#output+1]=output[i] end

当您最终完成输出流时,使用 str=table.concat(output) 将其转换为字符串

Sounds like a perfect job for table.concat
your output is just a table of bytes.

When you need to copy, you do it as you normally would for a table.
eg:

for i=#output-5,9 do output[#output+1]=output[i] end

When you finally are done with the output stream, convert it to a string with str=table.concat(output)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文