solrize
# हास्केल में इस कोड के एक संस्करण के बारे में एक प्रश्न पूछा और मैंने कुछ अन्य मामलों की कोशिश की और यह सोच रहा था कि क्या हो रहा था। मेरी मशीन पर "तेज़" कोड ~ 1 सेकंड लेता है और "धीमा" कोड ~ 1.3-1.5 लेता है (सब कुछ ghc -O2
के साथ संकलित किया जाता है)।'लॉग x/log 10` से' लॉगबेस 10 x` धीमा क्यों है, भले ही विशिष्ट हो?
import Data.List
log10 :: Double -> Double
--log10 x = log x/log 10 -- fast
--log10 = logBase 10 -- slow
--log10 = barLogBase 10 -- fast
--log10 = bazLogBase 10 -- fast
log10 = fooLogBase 10 -- see below
class Foo a where
fooLogBase :: a -> a -> a
instance Foo Double where
--fooLogBase x y = log y/log x -- slow
fooLogBase x = let lx = log x in \y -> log y/lx -- fast
barLogBase :: Double -> Double -> Double
barLogBase x y = log y/log x
bazLogBase :: Double -> Double -> Double
bazLogBase x = let lx = log x in \y -> log y/lx
main :: IO()
main = print . foldl' (+) 0 . map log10 $ [1..1e7]
I'd've आशा व्यक्त की कि GHC log y/log x
, के रूप में बिल्कुल वही बात में logBase x y
चालू करने के लिए जब विशेष में सक्षम होगा। यहां क्या हो रहा है, और logBase
का उपयोग करने का अनुशंसित तरीका क्या होगा?
ghc कुछ मामलों में 'लॉग 10' के निरंतर प्रसार कर सकता है। एक परिवर्तनीय आधार के साथ मापने का प्रयास करें। –
एनबी। 'डबल' के लिए 'फ़्लोटिंग' उदाहरण उपरोक्त 'fooLogBase' की परिभाषित परिभाषा के लिए' लॉगबेस 'को समान रूप से परिभाषित करता है। – dave4420
जब आप एलएलवीएम बैकएंड के साथ संकलित करते हैं तो वे सभी समान रूप से तेज़ होते हैं। – leftaroundabout