Эффективный пользовательский тип данных в Lua

Мне нужна двумерная векторная структура данных для использования в Lua. Пока что я нашел несколько решений этой проблемы:

  1. Классическое решение определения типа данных в чистом Lua - недостаток в том, что все операции с ним (например, добавление) должны создавать новый тип данных, устанавливать метатаблицы и т. Д. X, y хранятся в виде полей и, следовательно, имеют быстрый доступ.
  2. Классическое решение для полных пользовательских данных на стороне C - оно может быть быстрее, по-прежнему позволяет операторы, код операции - на стороне C, но все же каждая операция должна выполнять выделение нового объекта. Однако здесь нет возможностей для полей, поэтому нужно будет сделать специальную функцию __index / newindex для имитации x и y, что может быть медленным на стороне Lua.
  3. Гибридный подход, при котором мы определяем объект Lua, но через код C, x и y по-прежнему будут полями с простым доступом, но функции будут закодированы на C, следовательно, быстрее?

Я пробовал подход №1 и из-за проблем с эффективностью планирую перейти на №2 или №3, однако я не знаю, какой из них будет более эффективным.

С другой стороны, есть также возможность жестко закодировать тип данных в самом компиляторе, но я не думаю, что я еще готов к таким радикальным идеям :) (это не так безумно, как кажется, 2d вектор был бы неплохо вписывается в двойной размер нативного типа Lua).

Какой из двух методов будет более эффективным? Есть ли какие-нибудь питфалы, о которых я не думал в тех случаях?


person Kornel Kisielewicz    schedule 25.04.2011    source источник
comment
Вы знаете, что №1 работает слишком медленно?   -  person    schedule 25.04.2011
comment
@delnan, я знаю два золотых правила оптимизации Lua;). Также отход от №1 продиктован и другими причинами (развертывание структуры с уровня C и др.).   -  person Kornel Kisielewicz    schedule 25.04.2011
comment
Вы можете где-нибудь разместить свою реализацию №1? Может быть, это было не так оптимально.   -  person kikito    schedule 25.04.2011
comment
В Lua Gems был рецепт числового массива и типа векторных данных, созданный на C и хранящийся в userdata. Код не был таким сложным, большая часть сложности была связана с ведением домашнего хозяйства, возможностью видеть строки и столбцы матрицы как вектор без копирования данных и т. Д. Это была глава 16 «Учебник по научным вычислениям в Lua». Наверное, стоит посмотреть.   -  person RBerteig    schedule 22.11.2013


Ответы (1)


Вариант №4: используйте LuaJIT2 с FFI

См. соответствующую работу

person Doug Currie    schedule 25.04.2011
comment
+1: вау, хотя я не могу использовать LuaJIT (поддерживаются не все целевые архитектуры), это действительно очень интересная ссылка, спасибо! - person Kornel Kisielewicz; 26.04.2011