Эффективный изменяемый массив байтов в нативном Lua - PullRequest
10 голосов
/ 24 ноября 2010

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

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

Декодер должен иметь возможность:

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

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

Ответы [ 2 ]

11 голосов
/ 24 ноября 2010

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

9 голосов
/ 24 ноября 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...