精华内容
下载资源
问答
  • windows系统的时钟精度
    2021-05-13 23:25:01

    在linux下有类似windows下多媒体时钟的高精度时钟吗?linux默认时钟精度为多少?

    |

    In kernel 2.4.x, the precision of time is 10ms, and in kernel 2.6.x, one is 1ms.

    you can use sleep, nanosleep and select to implement timing.

    sleep: 1 second

    nanosleep: 20ms (2.4.x)  2ms (2.6.x)

    select:    10ms (2.4.x)  1ms (2.6.x)

    note: usleep has been discarded.

    if you hope to get interval of time, you can use time, get_time_of_day or asm instructions.

    |

    #include

    #include

    #include

    void Timer(int sec, long usec)

    {

    struct timeval tvSelect;

    tvSelect.tv_sec = sec;

    tvSelect.tv_usec = usec;

    select(FD_SETSIZE, NULL, NULL, NULL, &tvSelect);

    };

    int main()

    {

    printf("--- begin ---n");

    Timer(3, 1000*500);

    printf("--- bye ---n");

    }

    |

    用usleep是20ms

    用select是10ms

    |

    gettimeofday(&tv, NULL);

    tv的结构如下:

    struct timeval

    {

    long tv_sec;        /* seconds */

    long tv_usec;  /* microseconds */

    };

    gettimeofday的真正精确度是1us。

    如果要最小的延时只有用汇编

    __volatile__ __asm__("nop");

    可以实现一条指令的精度。

    我曾经做过定时和计数

    |

    linux的内核时钟好象是10ms的

    |

    man 3 sigtimedwait

    这个属于POSIX的实时扩展,应该是使用具体实现中所能得到的最高精度的计时机制。

    不要用上边有人说的用汇编指令的方式,因为你的进程可能在这个时候被抢占。

    如果要用其他的调用,要注意计时的操作只能使用一个系统调用(也是防止被抢占,这个是POSIX的标准建议的)。

    select的移植性不太好。

    如果要计时的话看看所有以clock_开头的函数。这些都是POSIX的实时计时函数。

    其他还可以自己对硬件时钟编程,或者使用CPU里边的Profiling计数器,但是这样难度有点大。

    如果真的对实时性要求非常高,还是要使用实时操作系统,就别用Linux了。

    |

    1,setitimer的精度只能达到毫秒级。

    2,setitimer有可能会丢失事件:

    BUGS        Under Linux, the generation and delivery of a signal are distinct,  and

    there each signal is permitted only one outstanding event.  It's there-

    fore conceivable that under pathologically heavy  loading,  ITIMER_REAL        will  expire  before  the  signal  from  a previous expiration has been

    delivered.  The second signal in such an event will be lost.

    3,setitimer是SVR4和4.4BSD要求的,不属于POSIX。

    |

    Its precision  is equal with one of kernel rescheduler.

    10ms (2.4.x) 1ms(2.6.x)

    更多相关内容
  • 还是太年轻,太相信windows 了 哈哈哈啊哈, 其实根本到不了这么高的精度 正常的一个sleep 的精度准确率在 10-15ms . 也就是说你想精准到 1毫秒 都办不到. 首先来了解下windows操作系统类型 操作系统分为 实时操作系统...

    如题

    这个问题呢 之前被问到过
    我当时也是猜的认为可以到纳秒 ,比如sleep(1) 可以到微秒 通过特殊的手段到纳秒

    还是太年轻,太相信windows 了 哈哈哈啊哈, 其实根本到不了这么高的精度

    正常的一个sleep 的精度准确率在 10-15ms .

    也就是说你想精准到 1毫秒 都办不到.

    首先来了解下windows操作系统类型

    操作系统分为 实时操作系统与非实时操作系统

    常见的实时操作系统

    freeRTOS 嵌入式的一些系统

    常见的非实时操作系统

    windows linux android

    主要的区别是任务调度的处理方式不同, 实时操作系统一般都是 基于任务优先级的调度方式(一旦内核把资源分配给某个进程,直到该进程完成或发生某事件而被阻塞(常见的方式主动调用delay),才再把处理机分配给其他进程,否则高优先级的任务会一直运行。所以这种情况下,如果某个高优先级的任务运行时间过长最好有阻塞机制,来让出CPU使其他低优先级的任务也有机会运行。)

    非实时操作系统是基于时间片的调度方式:这种方式下,所有任务的优先级相同,当内核给该进程分配的时间片结束后,内核会停止正在执行的这个进程,下一个时间片分配给其他进程执行,即便这个任务没有执行完也没有主动delay自己。

    这里有人会问了 windows 也能设置线程和进程的优先级啊 , 这里不展开描述 这个话题了(因为我也没有深入研究 ).

    看到这里 大家也基本能想到 为啥windows 的时钟精度不高了,那么怎么加高精度呢?

    msdn 有一篇文章说了一下这个

    https://docs.microsoft.com/en-us/archive/msdn-magazine/2004/march/implementing-a-high-resolution-time-provider-for-windows

    通过 QueryPerformanceCounter 这个玩意 高精度计时器 精度可以到1~100微秒

    21:23:22.296 
    21:23:22.297 
    21:23:22.297 
    21:23:22.298 
    21:23:22.298 
    21:23:22.299 
    

    那怎么到微秒和纳秒呢?

    下面的我也是在网上看到了 我发一下 ,也就知道个概念就好了 没真正测试过

    1. RDTSC - 粒度: 纳秒级 不推荐
      优势: 几乎是能够获得最细粒度的计数器
      抛弃理由:
      A) 定义模糊
    • 曾经据说是处理器的cycle counter,但是后来似乎又不是了。
      有的机器上每秒的TSC增长值等于CPU频率,有的却是一个不对应任何配置的数。到底是什么,Intel也没解释清楚。
      B) 不准确
    • 这是最重大的缺陷。再细的粒度,不准的话也没用,至少不能当时间用。
      在有的CPU上,特别是支持变频技术的笔记本CPU上,TSC增长值会随着CPU的频率改变。忙的时候跑得快,闲得时候跑得慢。
    1. QueryPerformanceCounter - 粒度: 1~100微秒级 不推荐
      优势: 尽管比RDTSC粒度稍低,但是不存在RDTSC在变频CPU上的问题。
      知道这个API的人估计都倾向于用这个,因为M 对 这 个 A P I 给 出 了 比 较 明 确 的 定 义 , 就 是 每 秒 钟 某 个 计 数 器 增 长 的 数 值 。 抛 弃 理 由 : 还 是 不 准 确 尽 管 没 有 源 代 码 , 但 是 从 M 对这个API给出了比较明确的定义,就是每秒钟某个计数器增长的数值。 抛弃理由: 还是不准确 尽管没有源代码,但是从M API:M的帮助文档和知识库可以了解到,PerformanceCounter是依赖于主板上与PCI设备有关联的硬件。这就意味着,PerformanceCounter的结果还是会受到硬件频率,特别是总线频率的影响。
      事实上,我在EeePC上测试的时候就发现,系统采用节能模式的时候PerformanceCounter出来的结果老是偏慢很多,超频模式的时候又偏快,而且用电池和接电源的时候效果还不一样!
    2. timeGetTime - 粒度: 毫秒级 推荐
      尽管粒度进一步降低,但是其无与伦比的优势就是,准确。
      在任何机器上返回的都是当前系统的启动时间,精确到1毫秒。
      使用注意事项:
      A) 在NT系统上(据说)默认精度为10ms,但是可以用timeBeginPeriod来降低到1ms
      B) 返回的是一个32位整数,所以要注意大约每49.71天会出现归零(不像前两个是64位数,要几百年才会归零)。

    参考:https://zhidao.baidu.com/question/2141227584775324308.html

    展开全文
  • Windows精度时钟

    2021-08-02 11:24:00
    Windows精度时钟 精度:<1us 微秒 1.1Function 1统计一段代码的CPU时间 LARGE_INTEGER freq; LARGE_INTEGER beginTime; LARGE_INTEGER endTime; QueryPerformanceFrequency(&freq); ...

    封装几个代码,方便以后查询和使用

    Windows高精度时钟 精度:<1us 微秒

    1.1Function 1统计一段代码的CPU时间

    	LARGE_INTEGER freq;
    	LARGE_INTEGER beginTime;
    	LARGE_INTEGER endTime;
    
    	QueryPerformanceFrequency(&freq);
    	QueryPerformanceCounter(&beginTime);
    	//测试代码块时间 Begin
    	
        //测试代码块时间 End
        QueryPerformanceCounter(&endTime);
        double second = (double)(endTime.QuadPart - beginTime.QuadPart) / (double)freq.QuadPart;
    

    1.2更方便的宏定义

    #define COUNT_BEGIN  LARGE_INTEGER freq,beginTime,LARGE_INTEGER endTime;\
    QueryPerformanceFrequency(&freq);\
    QueryPerformanceCounter(&beginTime);
    
    #define COUNT_END QueryPerformanceCounter(&endTime);
    #define SHOW_TIME_COUNT printf("%llf second passed\n",(double)(endTime.QuadPart - beginTime.QuadPart) / (double)freq.QuadPart;);
    

    2.1Function 2高精度Sleep()

    LARGE_INTEGER freq;  
    LARGE_INTEGER start, end;  
    QueryPerformanceFrequency(&freq);  
    unsigned int s = 0; //此处填入延时的秒数
    unsigned int ms = 0; //此处填入延时的毫秒数
    unsigned int us = 100000; //此处填入需要延时的微秒数  
    us += ms*1000+s*1000*1000;
    LONGLONG count = (us * freq.QuadPart) / (1000 * 1000);  
    QueryPerformanceCounter(&start);  
    count = count + startQuadPart ;  
    do  
    {  
       QueryPerformanceCounter(&end);  
    }while(end.QuadPart< count);  
    

    2.2 更方便的宏定义

    #define SLEEP_S(S)
    LARGE_INTEGER freq;  \
    LARGE_INTEGER start, end;  \
    QueryPerformanceFrequency(&freq);  \
    LONGLONG count = (S*1000*1000 * freq.QuadPart) / (1000 * 1000);  \
    QueryPerformanceCounter(&start);  \
    count = count + startQuadPart ;  \
    do  \
    {  \
       QueryPerformanceCounter(&end);  \
    }while(end.QuadPart< count);  
    
    #define SLEEP_MS(MS)
    LARGE_INTEGER freq;  \
    LARGE_INTEGER start, end;  \
    QueryPerformanceFrequency(&freq);  \
    LONGLONG count = (S*1000 * freq.QuadPart) / (1000 * 1000);  \
    QueryPerformanceCounter(&start);  \
    count = count + startQuadPart ;  \
    do  \
    {  \
       QueryPerformanceCounter(&end);  \
    }while(end.QuadPart< count);  
    
    #define SLEEP_US(US)
    LARGE_INTEGER freq;  \
    LARGE_INTEGER start, end;  \
    QueryPerformanceFrequency(&freq);  \
    LONGLONG count = (US * freq.QuadPart) / (1000 * 1000);  \
    QueryPerformanceCounter(&start);  \
    count = count + startQuadPart ;  \
    do  \
    {  \
       QueryPerformanceCounter(&end);  \
    }while(end.QuadPart< count);  
    
    展开全文
  • 给出一个基于Windows操作系统的计算机网络同步时钟实现方案,该方案可以有效提高计算机时钟同步精度,在LAN中时钟同步精度达250 μs。同时采用了校正时钟频率误差算法,校正后的时钟长期计时误差能达到10天少于1 s。
  • Windows下时间精度

    千次阅读 2014-07-25 17:17:59
    Windows为非实时系统,它的Timer通常精度不是很高,下面是常用的Timer设置处理 常用的时间精度 1. SetTimer/OnTimer 根据MSDN中的定义,可以知道,最下值是参考宏USER_TIMER_MINIMUM. If uElapse is less than USER...

    Windows下时间精度

    Windows为非实时系统,它的Timer通常精度不是很高,下面是常用的Timer设置处理

    常用的时间精度

    1.       SetTimer/OnTimer

    根据MSDN中的定义,可以知道,最下值是参考宏USER_TIMER_MINIMUM.

    If uElapse is less than USER_TIMER_MINIMUM, the timeout is set to USER_TIMER_MINIMUM.

    If uElapse is greater than USER_TIMER_MAXIMUM, the timeout is set to USER_TIMER_MAXIMUM.

    Windows 9855毫秒,Windows NT中,定时器的分辨率为10毫秒。

    #define USER_TIMER_MAXIMUM  0x7FFFFFFF
    #define USER_TIMER_MINIMUM  0x0000000A

     

     

    2.       Sleep(0)/Sleep(1)

    Sleep(n)的作用是让当前线程睡眠n毫秒,以便执行其他线程,如果没有其他线程,那睡眠n毫秒后,继续执行。

    根据MSDN中的定义设置为0时,检查一下是否busy,不忙时立即返回处理

    A value of zero causes the thread to relinquish the remainder of its time slice to any other thread of equal priority that is ready to run. If no other threads of equal priority are ready to run, the function returns immediately, and the thread continues execution.

    http://blog.sina.com.cn/s/blog_605f5b4f0100zcqx.html换上了双核cpu,问题出来了:Sleep(0)经常会比预期中更早返回。)

     

    3.       timeSetEvent-timeBeginPeriod-timeEndPeriod

    调用之后用timeSetTime()注册一个回调函数,即一个中断处理过程。

    Windows驱动程序最精确的周期性通知是由Windows的多媒体服务timeSetEvent()提供的。它的时间可以精确到1毫秒。

    多媒体播放/录制控制时,可以采用这个作为精度,相对比较可靠。

     

     

    4.       QueryPerformanceFrequency() QueryPerformanceCounter()函数

    理论上可以达到更高的精度

    QueryPerformanceFrequency返回硬件支持的高精度计数器的频率。

    QueryPerformanceCounter用于得到高精度计时器的值(如果存在这样的计时器)

     

    Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu  转载请标明来源 

     

    展开全文
  • 全网目前最好的,基于windows下写的四次握手ptp时钟同步程序,自动对时钟偏差进行修正,并计算双向延迟,实现毫秒级精度。修改时间需要提前关闭系统的自动对时功能,并用管理员方式打开程序。
  • 并且由于系统速度上的要求,同步的精度也成为一项重要指标。  PTP(Precision Time Protocol)协议是IEEE-1588中定义的一种精密时钟同步协议,PTP 协议主要针对于相对本地化、网络化的系统, 子网较好, 内部组件相对...
  • <p>1、使用指定局域网NTP服务,或公网NTP服务 <p>2、发送时钟同步事件到指定服务器 <p>3、设置同步时间间隔 <p>4、设置最大时间偏差(自动设置系统时间) <p>5、可视化图形用户界面</p>
  • 针对windows系统的高精度定时器

    千次阅读 2017-05-21 13:09:11
    然而,这种需求虽然存在,但是由于windows系统并不是一个实时操作系统,实现这种精度的定时器,并不是一件容易的事情。 Windows 不是实时操作系统,所以任何方案都无法绝对保证定时器的精度,只是能尽量减少误差。...
  • 在分布式系统中,常常需要一个全局时间,用来确定系统中各种事件发生的先后、协调各种消息的传...
  • 关键词:定时器 时钟 并口 数据采集引言数据采集系统在各行各业都有广泛的应用。目前,已有各种各样高速、高精度、多通道的数据采集卡问世。计算机通过卡上的模数转换器采入数据,然后进行数据存储、数据处理和图形...
  • 最近被内核时钟精度弄的很是郁闷。具体情况如下:扫盲:1秒=1000毫秒=1000000微妙=1000000000纳秒首先:linux有一个很重要的概念——节拍,它的单位是(次/秒)。2.6内核这个值是1000,系统中用一个HZ的宏表征这个值。...
  • 在分析IEEE1588原理以及影响同步精度因素的基础上,设计了基于Windows平台的时间同步方法,为分布式网络系统时钟精确同步提供了一种有效可行的解决办法。目前,Windows平台下直接在应用层获取的时间戳精度在10ms级...
  • Windows系统时间同步(NTP)工具(附源码) 1、使用指定局域网NTP服务,或公网NTP服务 2、设置同步时间间隔(与NTP服务通信频率) 3、设置最大时间偏差(自动同步系统时间) 4、发送时钟同步事件到指定服务器 5、可视化图形...
  • Windows.h> using namespace std; UINT id1, id2; /* hWnd: 窗口句柄 nMsg: 消息,这里是WM_TIMER nTimerid: 定时器id dwTime:当前系统时间,指从开机到现在所经过的毫秒数 */ void CALLBACK TimerProc(HWND hWnd...
  • 用硬件时钟同步系统时钟: 用系统时钟同步硬件时钟: 同步网络时间 查看和修改Linux的时间 时钟--详解 硬件时钟 系统时钟 时间同步 时间标准 网络时间 ntp时钟同步服务 chrony时钟同步服务 备注 ntp...
  • Windows平台下压铸机控制系统的研究阜新辽宁工程技术大学点气工程系(123000)吕振 刘宝良 陈国志 孟令航Windows是一个基于消息的非抢先式多任务操作系统,将其用于压铸机实时控制,有很多的困难与挑战...
  • 时钟系统(NTP子母钟系统)如何为高铁系统保驾护航 时钟系统(NTP子母钟系统)如何为高铁系统保驾护航 1、时钟系统概述 时钟系统是轨道交通系统的重要组成部份之一,其主要作用是为控制中心调度员、车站值班员、各...
  • ####一、弄清几个概念:1....该时间为Linux 内核的时钟系统所维护,并且被定时中断程序所驱动,该时间仅当Linux 系统运行过程中有意义。该系统时间表示为以UTC(通用协调时间,Universal Time Coord...
  • Windows实现高精度定时器的三种方法

    万次阅读 2018-08-25 14:42:57
    前段时间一个项目需要用到1/24s的高精度定时器,每秒的误差不能超过10ms,大约41.666666666毫秒的延时,普通Sleep肯定是没办法满足的了,可以用以下新的三种方法: /* // 1秒=1000毫秒(ms) // 1毫秒=1/1000秒(s)...
  • 时间同步服务器,保障您的计算机系统时钟精准 时间同步服务器,保障您的计算机系统时钟精准 随着计算机应用的广度和深度不断加大,网络中的设备种类和业务类型越来越多,服务器的数量也与日俱增。传统上,各种服务器...
  • 自动校时钟—gps标准时钟系统自动校时钟—gps标准时钟系统一、gps标准时钟系统产品介绍:gps标准时钟系统是针对计算机、自动化装置等进行校时而研发的高科技设备,该产品可从gps卫星(北斗卫星、cdma、b码接口、ptp)...
  • 浏览器的时钟精度

    2014-07-28 17:08:26
    时钟精度是指时钟更新的频率,大部分情况下,网络浏览器使用诸如setTimeout() 和setInterval()的函数调用系统默认时钟,这意味着浏览器部署代码时只能和系统时钟同步。Internet Explorer的日期对象(Date Object)也...
  • Windows-操作系统.ppt

    2022-06-22 12:31:40
    Windows-操作系统.ppt该文档详细且完整,值得借鉴下载使用,欢迎下载使用,有问题可以第一时间联系作者~
  • 出于这个原因,“----”值表示时钟推进太快,无法以任何精度估计分辨率。 Mono指示时钟源是否是单调的,有一个额外的限制。 时钟不仅必须向前移动,而且绝不能返回相同的值(即高频率)。 Fail表示时钟源在 >= ...
  • (1)返回高精度毫秒计时 long MyGetTickCount() { static BOOL init = FALSE; static BOOL hires = FALSE; static _int64 freq = 1; if(!init) { hires = QueryPerformanceFrequency((LARGE_INTEGER*)&...
  • 医院时钟系统(网络授时设备)设计方案 目 录 1、北京华人开创科技发展有限公司简介 2 2、用户需求分析、设计指导思想 3 2.1 用户需求分析 3 2.2 设计指导思想 4 3、设计依据 5 4、设计区域 5 5、优化建议 6 6、时钟...
  • NTP是一种常用的时间同步方式,同步精度可以达到毫秒级,能够满足绝大多数的应用场景,对于能够连接互联网的系统,设置windows系统自动的NTP时间同步,连接互联网上的时间服务器即可。对于局域网环境,则需要在该...
  • 在多核心或多处理器的计算机上,特别是在支持CPU频率动态调整的计算机上,windows系统下的QueryPerformanceFrequency()获取HPET(如果存...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,330
精华内容 3,332
热门标签
关键字:

windows系统的时钟精度