2010-11-24 3 views
7

Я пытаюсь сделать эффективную реализацию декодера LZ77 в родной Lua (то есть нет библиотеки C и никаких зависимостей от неосновных библиотек Lua) - см. liblzg.Эффективный изменяемый массив байтов в родном Lua

Для загрузки и разбора двоичного файла строка Lua работает отлично и с хорошей производительностью (например, с использованием метода s: byte (k)). Однако для создания декодированных выходных данных строки не очень оптимальны, поскольку они являются неизменяемыми, а конкатенация строк имеет тенденцию занимать много и много времени, когда выход становится большим.

декодер должен быть в состоянии:

  • Дозапись один байт на выходе в то время (до миллионов раз)
  • Read (более или менее произвольного доступа) из выходного буфера

Каковы наилучшие варианты? Размер выходных данных известен заранее, поэтому он может быть предварительно выделен.

+2

Из любопытства, почему вы не можете использовать библиотеку C? Это учебное упражнение или необходимость в изолированной среде Lua? – 2010-11-24 14:50:46

+0

Это более учебное упражнение (я хочу видеть производительность и то, как различные методы отличаются от низкоуровневого скомпилированного языка и среды управляемого сценария). Кроме того, я полагаю, что использование чистой реализации Lua упростит развертывание. – marcus256 2010-11-25 10:37:02

+0

Отличный вопрос. Btw Я не единственный, у кого была такая же идея. – Hydro 2017-03-20 14:00:36

ответ

7

Звучит как идеальную работу для table.concat вашей продукции просто таблица байт.

Когда вам нужно скопировать, вы делаете это, как обычно, для стола. например:

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

Когда вы, наконец, сделали с выходным потоком, преобразовать его в строку с str=table.concat(output)

10

Избегайте конкатенации строк: сохраняйте выходные строки в таблице и записывайте в нее все строки. Если вас беспокоит, что таблица становится слишком большой, периодически ее промывайте. См http://www.lua.org/pil/11.6.html

Смежные вопросы