2009-10-26 76 views
0

不必要的拳击,我玩DLR以更好地了解它。我不完全熟悉但其所有的概念和术语,它在我的问题的任何术语或概念上的错误,非常抱歉。避免在DLR

基本上,我理解的方式是,你绕过在表达式目录树对象,但您使用的粘合剂,以使您的对象的动态功能,其他DLR的语言中。因此,例如,直接在表达式树中(使用Expression.Add)添加,而不是直接在表达式树中创建一个活页夹,并在需要时由调用站点调用并为您添加内容。但是,由于您在加法操作结束时(如果操作数是例如两个Int32值)传递对象,所以必须将生成的Int32装箱到一个对象中(因为仍在绑定中)呼叫网站的期望。我有点担心这个不断的装箱/拆箱可能会影响运行时的性能。

这真的是它应该是怎样(所有拳击/拆箱)工作还是我失去了一些东西?

回答

1

在动态类型语言中,静态类型变量的识别和优化是一个特定于域的优化。在特定的动态语言X的实现中,您可以在生成的代码中保留一个未装箱的局部变量,但是只要您公开动态类型的API,就无法保证静态类型(动态语言的本质)。

为了避免装箱,你必须找出可以证明整个静态类型的代码段,然后通过Linq.ExpressionsILGenerator来为它们生成代码。

1

只要活页夹去,你也可以实现一个自定义活页夹。该自定义联编程序可以返回非对象类型或可以执行其他特定的优化。在IronPython中,我们使用DLR外层ComboBinder和ComboActionRewriter来优化条件。例如“如果a.b:”可以变成一个ComboBinder,它同时执行a.b和转换为bool。如果a.b导致一个非盒装布尔,我们将避免拳击和拆箱。我们计划试验更多像这样的优化。