3
內聯是什麼使GHC能夠執行的許多複雜優化成爲可能。如果我動態地鏈接一個庫(並且得到一個實際的dll/so文件),GHC是否仍然可以內聯在它所在的位置,就好像鏈接是靜態的,並且依賴於其餘的dll?還是我實際上得到較少的優化?動態鏈接是否會損害內聯,從而影響GHC的性能?
內聯是什麼使GHC能夠執行的許多複雜優化成爲可能。如果我動態地鏈接一個庫(並且得到一個實際的dll/so文件),GHC是否仍然可以內聯在它所在的位置,就好像鏈接是靜態的,並且依賴於其餘的dll?還是我實際上得到較少的優化?動態鏈接是否會損害內聯,從而影響GHC的性能?
當一個函數被標記爲{-# INLINE #-}
或{-# INLINEABLE #-}
-OR如果GHC認爲夠便宜™ - 整個未重整RHS被包括在接口.hi
文件一起編譯.o
對象。據我所知。
所以不,我敢肯定它不會傷害內聯。儘管動態鏈接會影響代碼的局部性,但與您關心的內聯方面相比,這是微觀優化。
警告:我沒有實際做過任何基準測試。
你有什麼需要支持的嗎?我的意思是,我知道接口文件,但我不知道GHC是否會將它們用於共享庫。它會如何?我是否將接口文件的共享庫路徑+路徑提供給可執行文件的編譯參數?我一直無法找到關於這件事的很多信息;目前對我來說非常模糊。謝謝您的回答。 – MasterMastic
這是我的頭頂,但你可以在[GHC wiki](https://ghc.haskell.org/trac/ghc/wiki/Commentary/Compiler/IfaceFiles)上閱讀。 GHC將無法查看任何(除此之外)任何東西(而不是接口文件)。 你可以閱讀如何[建立共享對象](https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/using-shared-libs.html),但我只是讓'cabal' [處理它](https://www.haskell.org/cabal/users-guide/installing-packages.html)。 (搜索「共享」。) 你沒有提到你爲什麼要使用共享庫。所以爲什麼? – liyang
哦!你的類型評論對於所有這一切突然產生了很大的意義;你很聰明。那麼我想我可以真的相信它會內聯,因爲它必須有它需要的信息。我現在不想使用共享庫來處理任何特定的事情,我只是不想在性能問題時排除它們(例如,即使是從共享庫中重複一個小函數的簡單循環,也可能會嚴重叮咬如果內聯不在那裏)。非常感謝你! – MasterMastic