优化 – 动态语言字段访问的最合适的数据结构

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

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

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

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

不过,我仍然存在分歧,如果这是最好的方法.我可以去寻找完美的散列函数.更根本的是,我正在考虑放弃对字符串的需求,并且实际上使用2长的结构.

这两个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>

正如我所说的那样,希望它会有用.不知道是否会!

点赞