QLIB now offers a great Profiler.

Under 386/486 it uses the PIT to time code for efficency.
Under Pentium (CPL3) it uses the Pentium cycle clock.
Under Pentium (CPL0) it uses the Pentium cycle clock and MSRs.

The Profiler is included within QLIB.LIB so there are no extra LIBs
to add to include the profiler.  The profiler itself is only 2k.

You can easily add the profiler to your programs to quickly test any part
of your code.  See \profiler\profiler.asm for a good example of it's use.

profiler_init()
  - sets up fast timers, disables all IRQs except kbd and PIT.
  - Returns:
    0 = successful (Pentium MSRs not available)
    1 = successful (Pentium MSRs available)
profiler_start(profiler_info *)
  - start a timing
  - you must set idx1 and idx2 if Pentium MSRs will be monitored.
profiler_stop(profiler_info *)
  - stop a timing
profiler_print(profiler_info *)
  - prints stats within profiler_info struct at current pos on screen
  - this info can vary depending if certain system resources where available.
profiler_uninit()
  - resets PIT, DOS-time, IRQ masks, etc.

Notes:
  - Try to dword align all profiler_info struct's for max accuracy.
  - see \Profiler\Profiler.asm for a good example of it's usage.
  - Try to repeat your code enough so that the effects of the Profilers
    Code is minimum compared to your code.  Although this is not necessary.
 
