【发布时间】:2011-06-14 07:40:47
【问题描述】:
我正在实现一种将编译为 C# 的动态语言,并且它正在实现自己的反射 API(.NET 太慢,并且 DLR 仅限于更新和资源丰富的实现)。
为此,我实现了一个简单的 .GetField(string f) 和 .SetField(string f, object val) 接口。直到最近,实现只是切换所有可能的字段字符串值并进行相应的操作。 此外,这种动态语言可以定义匿名对象。对于那些匿名对象,一开始我实现了一个简单的哈希算法。
到现在为止,我正在寻找优化语言动态部分的方法,并且我发现匿名对象的哈希算法会有点过头了。这是因为对象通常很小。我会说这些对象通常包含 2 或 3 个字段。很少,它们会包含超过 15 个字段。与我测试它们之间的相等性相比,实际散列字符串并执行查找将花费更多时间。 (这未经测试,只是理论上的)。
我做的第一件事是——在编译时——为每个匿名对象声明创建一个红黑树,并将它放在一个数组上,以便对象可以以非常优化的方式查找它。
不过,如果这是最好的方法,我仍然存在分歧。我可以选择一个完美的散列函数。更激进的是,我正在考虑放弃对字符串的需求,并实际使用 2 个 long 的结构。
这两个 long 将被编码为每个支持 10 个字符 (A-za-z0-9_),这主要是对字段大小的良好预测。对于大于此的字段,还会提供一个特殊的函数(较慢)接收字符串。
结果将是字符串将被内联(而不是引用),并且它们的比较将与长比较一样便宜。
无论如何,要找到关于这种优化的好信息有点困难,因为这通常是在 vm 级别上考虑的,而不是静态语言编译实现。
是否有人对处理动态调用的最佳数据结构有任何想法或提示?
编辑: 现在,我真的将字符串作为长表示和线性二叉树查找。
【问题讨论】:
标签: optimization data-structures dynamic hash tree