2009-10-26 69 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導致一個非盒裝布爾,我們將避免拳擊和拆箱。我們計劃試驗更多像這樣的優化。