我正在用F#撰寫一個較大的專案,其中性能是至關重要的。目前的核心結構是19個具有相同簽名的函式:引數->記錄->結果(記錄,錯誤)和適當的組合/系結,以確保前一個函式產生的記錄被用于下一個。這些引數永遠不會被覆寫,因此它們在所有19個函式呼叫中都是一樣的。這里是 "最終 "函式:
let執行引數 record =
let (>==) m f = Result.bind (f parameters) m
記錄
|> stepOne引數
>==步驟二
>==stepThree
我的問題是。就性能(或風格)而言,將步驟定義為型別為record -> record的 "執行 "子函式是否更好,這樣就不必通過不同的函式傳遞19次相同的引數? 它還允許代碼依賴于特定的引數(引數是一種記錄型別),而不是一次性的所有引數。另一方面,這些子函式不能在此范圍之外被重用(我認為它們永遠不會被重用),這可能會使單元測驗更加困難。在我的案例中,這也意味著一個非常長的執行函式,這可能是不可取的。非常感謝任何意見!
uj5u.com熱心網友回復:
"就性能(或風格)而言,將步驟定義為型別為record -> record的 "執行 "子函式是否更好,這樣相同的引數就不必通過不同的函式傳遞19次?"
最肯定的是,是的。
最肯定的是,是的。只要把它寫成這樣,然后profile它。
更普遍的是:
進入一個好的F#編程風格需要一些時間,閱讀書籍或好的代碼庫有助于達到這個目的。
你的代碼使用了 "面向鐵路的編程",Scott Wlaschin對此做了最好的解釋。https://fsharpforfunandprofit.com/rop/
這種編程風格很好,但肯定不適合于高性能的回圈。但即使在對性能高度敏感的程式中,也只有5%的代碼是在高性能回圈中。因此,漂亮的設計模式還有很大的空間。優化核心性能的代碼只能針對具體的情況。而這個技術在一開始就是嘗試和剖析。如果你提到的代碼真的處于性能關鍵路徑中,那么你的測量結果將顯示,避免函式呼叫和引數傳遞會導致代碼更快。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/309377.html
標籤:
