2009-08-17 62 views

回答

5

從C代碼調用託管方法目前的API有這類的開銷:

  • 它的一些鎖和哈希查找操作看,如果你調用方法和synthetized helper方法編譯
  • 如果方法尚未編譯它們被編譯
  • 實際的方法,我的本機代碼nvocation速度快,相反,在一些沒有封送處理開銷發生的答案,所以Blittable型等這樣的考慮的猜測並不適用
  • 如果返回類型是值類型,則該值是盒裝:這會導致一些GC開銷。請注意,對於返回空白或參考類型的方法,沒有開銷

我們將介紹一種新的API,可以消除上面第一點和最後一點的開銷。與此同時,除非每秒執行數百萬次調用,否則這些開銷非常小,並且幾乎總是被稱爲做實際工作的實際託管方法所淹沒。

+0

感謝您的信息。對於#1,鎖定類似於全局解釋器鎖(在Python中)?另外,對於#3,複雜類型(類,...)如何通過呢? – jameszhao00 2009-08-18 15:36:16

+1

這是一把鎖,但它在蟒蛇沒有關係GIL:所有的Python代碼需要GIL運行,所以沒有其他的代碼可以在同時運行。我所談論的鎖基本上只在散列查找期間保持不變,其餘所有代碼可以與其他代碼同時運行。 一個複雜的類只是一個參考,因爲沒有編組發生,它只是一個指針副本。您和其他人對我們在此線程和P/Invoke機制中討論的嵌入調用API感到困惑。 – lupus 2009-08-19 07:00:38

+0

啊我明白了。謝謝。 – jameszhao00 2009-08-19 20:05:51

2

檔案,如果你想要或需要的具體細節,因爲這是你會知道你的具體情況是否足夠快的唯一途徑...

話雖這麼說,

Mono的原生API是非常快。當您使用Mono的C API創建對象時,它在創建對象時與託管運行時的功能基本相同。調用方法類似。

真正的開銷來在試圖通過與數據轉換來回。創建對象並調用方法的速度非常快 - 嘗試通過多種類型轉換數據的速度稍慢。但是,使用C API非常快,因此不太可能成爲性能問題。 (當然,除非你是在一個非常緊密的循環或類似的環境中進行這種操作,那麼可以將你的循環重構爲一個託管端的方法,然後調用它一次,這樣就可以實現一個上下文切換。 )

+1

它_very_強烈地取決於所涉及的類型。有些類型是blittable(即在C和CLR中完全相同的表示形式),所以不涉及編組 - 它可以直接根據調用約定和CALL將參數壓入堆棧。其他人,比如字符串,必須首先被複制並按照預期的形狀進行按摩。 – 2009-08-18 01:01:36

+1

是的 - 類型的編組是昂貴的部分。構建一個對象並調用一個方法的速度很快,但是(提供了沒有類型需要編組的參數) – 2009-08-18 01:24:24

+0

太棒了。感謝那些信息。 – jameszhao00 2009-08-18 01:46:19