任何人有一個原生的開銷任何細節 - 在單>管理上下文切換?即通過調用.NET方法/使用C API創建.NET對象導致的開銷。嵌入單 - 的開銷土生土長 - >管理上下文切換
回答
從C代碼調用託管方法目前的API有這類的開銷:
- 它的一些鎖和哈希查找操作看,如果你調用方法和synthetized helper方法編譯
- 如果方法尚未編譯它們被編譯
- 實際的方法,我的本機代碼nvocation速度快,相反,在一些沒有封送處理開銷發生的答案,所以Blittable型等這樣的考慮的猜測並不適用
- 如果返回類型是值類型,則該值是盒裝:這會導致一些GC開銷。請注意,對於返回空白或參考類型的方法,沒有開銷
我們將介紹一種新的API,可以消除上面第一點和最後一點的開銷。與此同時,除非每秒執行數百萬次調用,否則這些開銷非常小,並且幾乎總是被稱爲做實際工作的實際託管方法所淹沒。
檔案,如果你想要或需要的具體細節,因爲這是你會知道你的具體情況是否足夠快的唯一途徑...
話雖這麼說,
Mono的原生API是非常快。當您使用Mono的C API創建對象時,它在創建對象時與託管運行時的功能基本相同。調用方法類似。
真正的開銷來在試圖通過與數據轉換來回。創建對象並調用方法的速度非常快 - 嘗試通過多種類型轉換數據的速度稍慢。但是,使用C API非常快,因此不太可能成爲性能問題。 (當然,除非你是在一個非常緊密的循環或類似的環境中進行這種操作,那麼可以將你的循環重構爲一個託管端的方法,然後調用它一次,這樣就可以實現一個上下文切換。 )
它_very_強烈地取決於所涉及的類型。有些類型是blittable(即在C和CLR中完全相同的表示形式),所以不涉及編組 - 它可以直接根據調用約定和CALL將參數壓入堆棧。其他人,比如字符串,必須首先被複制並按照預期的形狀進行按摩。 – 2009-08-18 01:01:36
是的 - 類型的編組是昂貴的部分。構建一個對象並調用一個方法的速度很快,但是(提供了沒有類型需要編組的參數) – 2009-08-18 01:24:24
太棒了。感謝那些信息。 – jameszhao00 2009-08-18 01:46:19
- 1. 問題一個土生土長的HTTP服務器
- 2. 一個土生土長的例外發生在
- 3. BlockingQueue中的上下文切換開銷
- 4. 土坯邊緣嵌入
- 5. 線程池是否會產生上下文切換開銷?
- 6. 上下文切換問題:管理上下文切換涉及哪部分OS?
- 7. 保持上下文菜單的本土風格的網頁
- 8. 陣營本土:如何建立從下長大的菜單嗎?
- 9. 轉換使用推土機
- 10. Android和菜單本土化
- 11. 陣營本土開始
- 12. spinlocked線程如何避免上下文切換的開銷?
- 13. 在土耳其文中嵌入英文單詞的預期結果是什麼?
- 14. 領土地圖生成
- 15. 本土化的WinForms
- 16. 轉換土耳其字符
- 17. 如何估計線程上下文切換開銷?
- 18. 虛擬內存如何增加上下文切換開銷?
- 19. 在推土機
- 20. 推土機與maven
- 21. 與土壤
- 22. 爲方法=「黃土」
- 23. 加入海關欄管理員>銷售>訂單
- 24. MySql土耳其文字符
- 25. 如何推土機
- 26. 機械土耳其
- 27. 上下文切換死鎖
- 28. 嵌套Python上下文管理器
- 29. 土壤未處理的異常在0x585727FF
- 30. Python土豆炮
感謝您的信息。對於#1,鎖定類似於全局解釋器鎖(在Python中)?另外,對於#3,複雜類型(類,...)如何通過呢? – jameszhao00 2009-08-18 15:36:16
這是一把鎖,但它在蟒蛇沒有關係GIL:所有的Python代碼需要GIL運行,所以沒有其他的代碼可以在同時運行。我所談論的鎖基本上只在散列查找期間保持不變,其餘所有代碼可以與其他代碼同時運行。 一個複雜的類只是一個參考,因爲沒有編組發生,它只是一個指針副本。您和其他人對我們在此線程和P/Invoke機制中討論的嵌入調用API感到困惑。 – lupus 2009-08-19 07:00:38
啊我明白了。謝謝。 – jameszhao00 2009-08-19 20:05:51