一个连续更新,高精度的时间供应器
2006-07-20 11:38:26 来源:WEB开发网核心提示: template< typename counter_type, int KEEP_WITHIN_MICROS = 100, int SYNCHRONIZE_THREAD_PRIORITY = THREAD_PRIORITY_BELOW_NORMAL, int TUNING_LIMI
template<
typename counter_type,
int KEEP_WITHIN_MICROS = 100,
int SYNCHRONIZE_THREAD_PRIORITY = THREAD_PRIORITY_BELOW_NORMAL,
int TUNING_LIMIT_PARTSPERBILLION = 100,
int MAX_WAIT_MILLIS = 10000,
int MIN_WAIT_MILLIS = 100
>
class time_provider
使用时间供应器获得当前时间类似于使用 Windows API:
typedef hrt::time_provider<hrt::performance_counter>time_provider_t;
time_provider_t& provider=time_provider_t::instance();
SYSTEMTIME st;
provider.systemtime(&st);
Figure 7 解释了time_provider 类可用的模板参数、类型定义和成员函数。你可能会对将不同的调谐参数被指定为模板参数感到奇怪。从我的观点来看,他们全都是设计参数,并且可以在编译时,根据你的应用程序的需求来确定。
Figure 8 的代码示范了使用 time_provider 类在一个小循环中收集原始时间的例子,然后转换和输出。在下载的源代码中你可以找到另外一个使用多线程的例子(在多线程环境中示范了同样的想法)。
性能因子
那么使用 time_provider 类获得系统时间的开销有多大呢?当你必须计算时间而不只是获取时间时,一些额外的工作是不可避免的。如果你确实关心代码某些临界部分中的性能,使用 Figure 8 中所示的涉及原始计数器值的技术。使用原始值让你延迟系统时间转化,这样不会立即产生额外的开销(调用收集计数器本身的值除外,当然,这是不可避免的)。
Figure 9 的表格中显示得很清楚,它给出了一个 Win32 API 相对于 time_provider 的性能评估。表格中的数字是相对于在Windows XP 对称多处理器(SMP)系统上 GetSystemTime 执行时间的百分比(括号中的数字对应单处理器系统)。
更多精彩
赞助商链接