Мне нужна двумерная векторная структура данных для использования в Lua. Пока что я нашел несколько решений этой проблемы:
- Классическое решение определения типа данных в чистом Lua - недостаток в том, что все операции с ним (например, добавление) должны создавать новый тип данных, устанавливать метатаблицы и т. Д. X, y хранятся в виде полей и, следовательно, имеют быстрый доступ.
- Классическое решение для полных пользовательских данных на стороне C - оно может быть быстрее, по-прежнему позволяет операторы, код операции - на стороне C, но все же каждая операция должна выполнять выделение нового объекта. Однако здесь нет возможностей для полей, поэтому нужно будет сделать специальную функцию __index / newindex для имитации x и y, что может быть медленным на стороне Lua.
- Гибридный подход, при котором мы определяем объект Lua, но через код C, x и y по-прежнему будут полями с простым доступом, но функции будут закодированы на C, следовательно, быстрее?
Я пробовал подход №1 и из-за проблем с эффективностью планирую перейти на №2 или №3, однако я не знаю, какой из них будет более эффективным.
С другой стороны, есть также возможность жестко закодировать тип данных в самом компиляторе, но я не думаю, что я еще готов к таким радикальным идеям :) (это не так безумно, как кажется, 2d вектор был бы неплохо вписывается в двойной размер нативного типа Lua).
Какой из двух методов будет более эффективным? Есть ли какие-нибудь питфалы, о которых я не думал в тех случаях?
userdata
. Код не был таким сложным, большая часть сложности была связана с ведением домашнего хозяйства, возможностью видеть строки и столбцы матрицы как вектор без копирования данных и т. Д. Это была глава 16 «Учебник по научным вычислениям в Lua». Наверное, стоит посмотреть. - person RBerteig   schedule 22.11.2013