Я реализую динамический язык, который будет компилироваться в C #, и он реализует собственный API отражения (.NET слишком медленный, а DLR ограничен только более свежими и находчивыми реализациями).
Для этого я реализовал простой интерфейс .GetField (строка f) и .SetField (строка f, object val).До недавнего времени реализация просто переключала все возможные значения строки поля и выполняла соответствующее действие.Кроме того, этот динамический язык имеет возможность определять анонимные объекты.Для этих анонимных объектов сначала я реализовал простой алгоритм хеширования.
К настоящему времени я ищу способы оптимизации динамических частей языка, и я столкнулся с тем фактом, что алгоритм хэшированиядля анонимных объектов было бы излишним.Это потому, что объекты обычно маленькие.Я бы сказал, что объекты содержат 2 или 3 поля, как правило.Очень редко они будут содержать более 15 полей.На самом деле потребуется больше времени для хеширования строки и выполнения поиска, чем если бы я проверял равенство между ними всеми.(Это не проверено, только теоретически).
Первое, что я сделал, - во время компиляции - создал красно-черное дерево для каждого объявления анонимного объекта и поместил его в массив так,что объект может искать его очень оптимизированным способом.
Я все еще разделен, хотя, если это лучший способ сделать это.Я мог бы пойти на идеальную функцию хеширования.Еще более радикально, я думаю о том, чтобы отбросить потребность в строках и фактически работать со структурой из двух длин.
Эти два длинных будут закодированы для поддержки 10 символов (A-za-z0-9_) каждый, что в основном является хорошим прогнозом размера полей.Для полей больше этого значения также будет предусмотрена специальная функция (более медленная), получающая строку.
В результате строки будут встроены (не ссылки), и их сравнения будут такими же дешевыми, как и длинные.сравнение.
В любом случае, немного сложно найти хорошую информацию об этом виде оптимизации, поскольку обычно это делается на уровне vm, а не на реализации компиляции статического языка.
Есть ли у кого-нибудь мысли или советы по поводу лучшей структуры данных для обработки динамических вызовов?
Редактировать: На данный момент, я действительно буду работать со строкой так долгопредставление и поиск в линейном двоичном дереве.