在我的測驗中,每次操作看起來divMod'功能Data.Fixed需要約 200ns(criterionx86 Mac 上的基準測驗)。我所做的是禁用divMod'我撰寫的函式,然后比較之前和之后的基準測驗時間以得出凈開銷。啟用后,該divMod'功能耗時約 230ns,禁用時耗時約 30ns。
divMod'我可以使用更快的替代方案嗎?我也可以將它專門用于單一型別,比如Double幫助加快速度。
環顧四周,但沒有看到任何關于“divMod”性能的提及。所以,在這里問。
我不能quotRem直接使用,因為我需要在double.
uj5u.com熱心網友回復:
看起來庫函式是這樣定義的:
-- | Generalisation of 'div' to any instance of 'Real'
div' :: (Real a,Integral b) => a -> a -> b
div' n d = floor ((toRational n) / (toRational d))
-- | Generalisation of 'divMod' to any instance of 'Real'
divMod' :: (Real a,Integral b) => a -> a -> (b,a)
divMod' n d = (f,n - (fromIntegral f) * d) where
f = div' n d
您可以以Double某種近似為代價對其進行調整并簡化它:
divDouble :: Double -> Double -> Int
divDouble n d = floor (n / d)
{-#INLINABLE divDouble #-}
divDoubleMod :: Double -> Double -> (Int,Double)
divDoubleMod n d = (f,n - (fromIntegral f) * d) where
f = divDouble n d
{-#INLINABLE divDoubleMod #-}
希望Double除法比 上的原始除法更快Rational,即使它更近似。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/411547.html
標籤:
上一篇:我的玩具語言的評估器不會輸入檢查
