optimization - 最适合动态语言字段访问的数据结构

标签 optimization data-structures dynamic hash tree

我正在实现一种将编译为 C# 的动态语言,并且它正在实现自己的反射 API(.NET 太慢,并且 DLR 仅限于更新和资源丰富的实现)。

为此,我实现了一个简单的 .GetField(string f) 和 .SetField(string f, object val) 接口(interface)。直到最近,实现只是切换所有可能的字段字符串值并进行相应的操作。
此外,这种动态语言可以定义匿名对象。对于那些匿名对象,起初,我实现了一个简单的哈希算法。

到目前为止,我正在寻找优化语言的动态部分的方法,并且我发现匿名对象的哈希算法将是矫枉过正的事实。这是因为对象通常很小。我会说这些对象通常包含 2 或 3 个字段。很少,它们会包含超过 15 个字段。与我测试它们之间的相等性相比,实际散列字符串并执行查找将花费更多时间。 (这没有经过测试,只是理论上的)。

我做的第一件事是——在编译时——为每个匿名对象声明创建一个红黑树,并将它放在一个数组上,以便对象可以以非常优化的方式查找它。

但是,如果这是最好的方法,我仍然存在分歧。我可以选择一个完美的散列函数。更激进的是,我正在考虑放弃对字符串的需求,并实际使用 2 个 long 的结构。

这两个 long 将被编码为每个支持 10 个字符(A-za-z0-9_),这主要是对字段大小的良好预测。对于大于此的字段,还将提供接收字符串的特殊功能(较慢)。

结果将是字符串将被内联(而不是引用),并且它们的比较将与长比较一样便宜。

无论如何,要找到关于这种优化的好信息有点困难,因为这通常是在 vm 级别上考虑的,而不是静态语言编译实现。

有没有人对处理动态调用的最佳数据结构有任何想法或提示?

编辑:
现在,我真的将字符串作为长表示和线性二叉树查找。

最佳答案

我不知道这是否有帮助,但我会把它扔掉以防万一;

如果这是编译为 C#,您是否知道编译时的完整字段列表?所以作为一个想法,如果你的代码读取

// dynamic
myObject.foo = "some value";
myObject.bar = 32;

然后在解析过程中,您的符号表可以为每个字段名称构建一个 int ;
// parsing code
symbols[0] == "foo"
symbols[1] == "bar"

然后使用数组或列表生成代码;
// generated c#
runtimeObject[0] = "some value"; // assign myobject.foo
runtimeObject[1] = 32; // assign myobject.bar

并将反射构建为一个单独的数组;
runtimeObject.FieldNames[0] == "foo"; // Dictionary<int, string>
runtimeObject.FieldIds["foo"] === 0;  // Dictionary<string, int>

正如我所说,扔掉是希望它有用。不知道会不会!

关于optimization - 最适合动态语言字段访问的数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4778988/

相关文章:

ios - Xcode Swift 中不同字体大小的 UILabel 居中文本对齐问题

r - 在 constrOptim 中与简单的约束作斗争

javascript - 调试慢速 jQuery 代码

java - 循环链表去除尾部没有循环

c++ - QTableWidget中如何动态分配单元格

android - 动态添加元素到布局

c++ - 一切都不稳定

java - 用于以数据库表格格式计算频率的数据结构

c - 结构体中 char 数组的初始化

jquery - 如何使用 jquery 更改元素的悬停伪类