[GHC] #12999: Investigate use of floating-point arithmetic in I/O Event-handler
GHC
ghc-devs at haskell.org
Sun Dec 18 08:01:04 UTC 2016
#12999: Investigate use of floating-point arithmetic in I/O Event-handler
-------------------------------------+-------------------------------------
Reporter: hvr | Owner:
Type: task | Status: new
Priority: normal | Milestone: 8.2.1
Component: | Version: 8.0.1
libraries/base |
Keywords: | Operating System: Unknown/Multiple
Architecture: | Type of failure: None/Unknown
Unknown/Multiple |
Test Case: | Blocked By:
Blocking: | Related Tickets:
Differential Rev(s): | Wiki Page:
-------------------------------------+-------------------------------------
I was asked/made aware of some questionable use of floating-point
arithmetic in `GHC.Event.TimerManager`;
Specifically, I can't explain why `getMonotonicTime` first gets a
timestamp as `Word64`, only to perform a not-necessarily cheap floating-
point division, and returns a `Double`...
{{{#!hs
-- | Return monotonic time in seconds, since some unspecified starting
point
getMonotonicTime :: IO Double
getMonotonicTime = do w <- getMonotonicNSec
return (fromIntegral w / 1000000000)
foreign import ccall unsafe "getMonotonicNSec"
getMonotonicNSec :: IO Word64
}}}
which then gets used e.g. by
{{{#!hs
updateTimeout :: TimerManager -> TimeoutKey -> Int -> IO ()
updateTimeout mgr (TK key) us = do
now <- getMonotonicTime
let expTime = fromIntegral us / 1000000.0 + now
editTimeouts mgr (Q.adjust (const expTime) key)
wakeManager mgr
}}}
Whereas, the priority queue (`GHC.Event.PSQ`) then uses `Double`s for its
priorities...
For correctness and performance reasons, I'd expect the use of fixed-width
integers (i.e. `Word64` or `Int64`) for such codepaths...
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/12999>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list