[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