- 论坛徽章:
- 9
|
在man查询times,可以得知times的返回值是当前所经历的tick数,而sysconf(_SC_CLK_TCK)所返回的是1秒钟会经过的tick数。
根据此原理,设计以下代码,我在多核实机上测试过没有问题,休眠5秒后所打印的past tick是5000,其中tps打印的结果是100。
而在windows实机,linux虚拟机上,虽然tps也是100,但是past tick却只有3320左右(另外一台实机的虚拟机只有2680左右)。
貌似这个方法还是不能很好的工作,请问有替代方法否?(gettimeofday会被修改系统时间影响,因此不适合,排除)
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <sys/times.h>
- unsigned long GetTickCount()
- {
- static unsigned long s_mode = 0;
- static unsigned long s_tt = 0;
- if (s_mode == 0)
- {
- unsigned long tps = (unsigned long)sysconf(_SC_CLK_TCK);
- printf("tps = %lu\r\n", tps);
- if (1000 % tps == 0)
- {
- s_tt = 1000 / tps;
- s_mode = 1;
- }
- else
- {
- s_tt = tps;
- s_mode = 2;
- }
- }
- struct tms t;
- const unsigned long dw = (unsigned long)times(&t);
- return (s_mode == 1 ? (dw * s_tt) : (unsigned long)(dw * 1000LL / s_tt));
- }
- int main(int, char**)
- {
- unsigned long u1 = GetTickCount();
- printf("begin tick = %lu\r\n", u1);
- sleep(5);
- unsigned long u2 = GetTickCount();
- printf("end tick = %lu\r\npast tick = %lu\r\n", u2, u2 - u1);
- return 0;
- }
复制代码 |
|