Greetings,
as I ran in some "calculate to zero" trouble with my assumptions on the
tick resolution in Solaris x86, I wrote a test module (source/binary
available on request) to verify the characteristics of the usual
suspects ddi_getlbolt(), gethrtime() and drv_usectohz().
Here are my findings from some x86_64 machines:
o 3GHz Pentium-D:
gethrtime() latency: 192ns
gethrtime() resolution: 192 (eff. 1ns)
ddi_get_lbolt() latency: 4ns
ddi_get_lbolt() resolution: 9904769ns
o 2.2GHz Core-2 Duo (4 times faster for gethrtime() at 30% lower
clock rate!):
gethrtime() latency: 48ns
gethrtime() resolution: 48 (eff. 1ns)
ddi_get_lbolt() latency: 2ns
ddi_get_lbolt() resolution: 9935202ns
o Even better: those are from an old 1.6GHz Opteron:
gethrtime() latency: 39ns
gethrtime() resolution: 41 (eff. 1ns)
ddi_get_lbolt() latency: 6ns
ddi_get_lbolt() resolution: 9952182ns
o On all machines, the tick resolution is 10ms, which reflects in what
the drv_usec/hz functions return:
drv_usectohz(1) = 1
drv_usectohz(1000) = 1
^^^^ some (like) might not expect this
drv_usectohz(1000000) = 100
drv_usectohz(1000000000) = 100000
drv_hztousec(1) = 10000
drv_hztousec(1000) = 10000000
drv_hztousec(1000000) = 10000000000
=> Bottom line:
o The low tick resolution, in combination with the 'usec' "resolution"
of the names of the conversion functions can easily cause problems. I
think this should at least be mentioned in the man page.
o Choose your timing functions wisely depending on your requirements on
latency and resolution (also applies to the kernel, which uses
gethrtime() pretty intensively - and 200ns is not cheap!).
Finally, one question as I could not find the code for gethrtime(): is
CPU frequency scaling always considered?
Joachim
--
Joachim Worringen, Software Architect, Dolphin Interconnect Solutions
phone ++49/(0)228/324 08 17 - http://www.dolphinics.com
_______________________________________________
opensolaris-code mailing list
[email protected]
http://mail.opensolaris.org/mailman/listinfo/opensolaris-code