type ProfileReader = IO Profile
type ProfileSink = SinkInput -> IO ()
readProfile :: FilePath -> IO Profile
profile :: CreateProcess -> IO (ProfileReader,ProcessHandle)
profileCallback :: CreateProcess -> ProfileSink -> IO ProcessHandle
The
readProfile
function can parse an .hp file from an earlier run and build an easy to query structure from it. The profile
function takes a process to run and returns an IO action that lets the caller look at the snapshot of the profile at the given moment. For those who want to manage profiling data on their own, the profileCallback
function is provided, which takes a callback function that’s called whenever some new piece of information is available. Its input has the following form:data SinkInput = SinkSample Time ProfileSample
| SinkId CostCentreId CostCentreName
| SinkStop
There are three possibilities: a snapshot that lists active cost centres with their associated costs, an association between a numeric id (created by the library, used in the samples) and the name of the cost centre, and an indication that no more data should be expected. Note that
SinkInput
is an instance of Show
, therefore print
can be used as a callback function.For the time being, the following functions are provided to query the
Profile
structure:type CostCentreId = Int
type CostCentreName = String
type Time = Double
type Cost = Int
type ProfileSample = [(CostCentreId,Cost)]
costCentreName :: Profile -> CostCentreId -> Maybe CostCentreName
costCentreNames :: Profile -> [(CostCentreId,CostCentreName)]
toList :: Profile -> [(Time,ProfileSample)]
intervalToList :: Profile -> Time -> Time -> [(Time,ProfileSample)]
profileLength :: Profile -> Time
Caveat: it’s all preliminary and makes no attempt at being efficient, but it seems to work fine at first glance. Do play with it and shower me with your comments. :)
Looks simple and comprehensible. Curious to see where you're taking it next!
ReplyDeleteSome people are going to hate you though, for using the correct spelling of 'centre' ;)
Hah, at least there’s one little thing I got right. ;)
ReplyDeleteWell, the next step is to create the real-time visualiser using this library. If everything goes well, part of its code can also be used later for the converters.