Thanks all for the contributions.
Maybe I need to revist epikTimer. My implementation was basically a procedure to create the ET instance for each measurement. Then ET.Start at the start of the read and compuations. Then ET.Stop, followed by ET.Elapsed (from memory - not got access to the code off hand). But it was REALLY slow.
The points about averaging all make sense of course. Measure the time to do 10 blocks, or 100 blocks, and average them. But, if the start time in MS is 1234 and the end time is 1234, then there is no measure of time to measure, and ergo, average. If Block one reads an average time of 0, and block two reads an average time of 0 (because all the reads are taking less than 1 Ms) then the average is 0.
I will perhaps just discard the idea. There has to be a way to do it because I know of tools that do so, like WinHex, FTK Imager and others. They can all measure the speed that the task is running (reading the disk) so I obviously just need to do what programers do best and think of and arrive at another solution. I guess I could incoporate a counter and have a timed start, and say when the counter has looped 100 times, have an end time, compute the time elapsed, divided by the number of loops and multiplied by the number of bytes processed? Then reset the counter to zero again and initiliase the timers again