2016-12-24 57 views
3

F#中嵌套函數是否存在性能問題?嵌套函數性能(F#)

如果我有一個函數在數組中的每個項目上調用,並且此函數嵌套了內部函數,那麼這是否意味着每次迭代都需要聲明,創建並分配所有內部嵌套函數?

看起來效率很低,但我真的很喜歡嵌套函數的可讀性而不是私有的外部函數。

+3

也許 - 基準測試並參見 –

+1

感興趣:[F#interactive #time](https://docs.microsoft.com/en-us/dotnet/articles/fsharp/tutorials/fsharp-interactive/) - [示例] (https://github.com/jack-pappas/fsharp-logic-examples/blob/d78b170ecfd7526971153e2f2a27446e0c51dd6e/Examples/dp.fsx#L41) –

回答

13

編譯器將嵌套函數提取到繼承於FSharpFunc的類中,這些類嵌套在定義其父函數的模塊或類型中。因此,編譯器基本上爲您做了什麼,否則您將手動執行外部私有功能。

運行時發生的所有事情都是這些對象的實例化。與執行內聯代碼相比,它有一定的成本,但是我認爲這大大低於你在心智模型中預期的。

它確實爲GC留下了額外的對象。那麼這個對象實例化會在一個緊密的循環中起作用嗎?在一個天真的實現中,每次迭代都會重新實例化函數對象,也許是的。但是F#編譯器比這更聰明,通常在循環外實例化循環體中使用的函數。所以再次,成本可能是最低的。

嚴重疑問時,請諮詢ILSpy和基準。作爲一個經驗法則 - 不要爲此煩惱,只能使用嵌套函數。

+0

真棒的答案。謝謝你的幫助。 – Connel

+1

你忘了提起非閉合內部功能。 –

+1

@FyodorSoikin:在這方面,封閉和非封閉功能是否有區別?我沒有觀察到它。 – scrwtp