{-| Drop-in replacement for the event tracing functions in "Debug.Trace" but are faster when user tracing is disabled. -} module Debug.Trace.String ( -- * Eventlog tracing -- $eventlog_tracing traceEvent , traceEventIO -- * Execution phase markers -- $markers , traceMarker , traceMarkerIO ) where import Control.Monad import qualified Debug.Trace as Base import Debug.Trace.Flags (userTracingEnabled) -- $eventlog_tracing -- -- Eventlog tracing is a performance profiling system. These functions emit -- extra events into the eventlog. In combination with eventlog profiling -- tools these functions can be used for monitoring execution and -- investigating performance problems. -- | Drop-in replacement for 'Debug.Trace.traceEvent' but is more efficient -- if user tracing in eventlog is disabled. -- -- Note that this function doesn't evaluate the 'String' if user tracing -- in eventlog is disabled. -- -- The input should be shorter than \(2^{16}\) bytes. Otherwise the RTS -- generates a broken eventlog. traceEvent :: String -> a -> a traceEvent :: forall a. String -> a -> a traceEvent String message a a | Bool userTracingEnabled = forall a. String -> a -> a Base.traceEvent String message a a | Bool otherwise = a a -- | Drop-in replacement for 'Debug.Trace.traceEventIO' but is more efficient -- if user tracing in eventlog is disabled. -- -- Note that this function doesn't evaluate the 'String' if user tracing -- in eventlog is disabled. -- -- The input should be shorter than \(2^{16}\) bytes. Otherwise the RTS -- generates a broken eventlog. traceEventIO :: String -> IO () traceEventIO :: String -> IO () traceEventIO String message = forall (f :: * -> *). Applicative f => Bool -> f () -> f () when Bool userTracingEnabled forall a b. (a -> b) -> a -> b $ String -> IO () Base.traceEventIO String message -- $markers -- -- When looking at a profile for the execution of a program we often want to -- be able to mark certain points or phases in the execution and see that -- visually in the profile. -- -- For example, a program might have several distinct phases with different -- performance or resource behaviour in each phase. To properly interpret the -- profile graph we really want to see when each phase starts and ends. -- -- Markers let us do this: we can annotate the program to emit a marker at -- an appropriate point during execution and then see that in a profile. -- | Drop-in replacement for 'Debug.Trace.traceMarker' but is more efficient -- if user tracing in eventlog is disabled. -- -- Note that this function doesn't evaluate the 'String' if user tracing -- in eventlog is disabled. -- -- The input should be shorter than \(2^{16}\) bytes. Otherwise the RTS -- generates a broken eventlog. traceMarker :: String -> a -> a traceMarker :: forall a. String -> a -> a traceMarker String message a a | Bool userTracingEnabled = forall a. String -> a -> a Base.traceMarker String message a a | Bool otherwise = a a -- | Drop-in replacement for 'Debug.Trace.traceMarkerIO' but is more efficient -- if user tracing in eventlog is disabled. -- -- Note that this function doesn't evaluate the 'String' if user tracing -- in eventlog is disabled. -- -- The input should be shorter than \(2^{16}\) bytes. Otherwise the RTS -- generates a broken eventlog. traceMarkerIO :: String -> IO () traceMarkerIO :: String -> IO () traceMarkerIO String message = forall (f :: * -> *). Applicative f => Bool -> f () -> f () when Bool userTracingEnabled forall a b. (a -> b) -> a -> b $ String -> IO () Base.traceMarkerIO String message