编程之美第1题-扩展

了解当前系统,进程,线程能效的api:

1. Sleep() – 这个方法能让当前线程“停”下来。可以看到这个函数参数的精确度达到ms。如果调用Sleep(0)可以使当前运行的线程放弃剩下的时间片,而使其他有相等优先级的线程得到机会运行。在msdn上,介绍了另一个相关的函数:timeGetDevCaps()。用来获取 支持的时间分辨率。使用timeStartPeriod设置时间分辨率。使用timeEndPeriod()结束上一次的设置。我在自己的计算机试了试,

period max = 1000000
period min = 1

不是很懂事什么意思。回来再研究研究。

2. WaitForSingleObject()自己停下来,等待某个事件发生。其实这个函数并不那么简单,其可以等待的并非仅仅是事件,而是由windows core创建的带有signal和nonsignal的多种对象。包括

Change notification
Console input
Event
Memory resource notification
Mutex
Process
Semaphore
Thread
Waitable timer
不过这里看到Sleep()后线程进入的ready的状态,而WaitForSingleObject()调用后是wait状态。这里说明一下两种状态的概念:

ready:等待执行。分发器会从ready状态的线程中挑选一个线程执行。

wait:等待其他对象,等待i/o等。在wait的条件得到了满足后,此状态线程根据优先级不同可以立刻开始执行,或转会到ready状态。

3. GetTickCount():嘀嗒。是我最喜欢用的计时函数,因为简单。纪录从系统启动后所流失的毫秒数,最多到49.7天。其精确度受限于计时器的解析精度。

4. QueryPerformanceFrequency() QueryPerformanceCounter():访问到精度更高的cpu数据。绝对是的,今天的计算机应该都支持high resolution的功能了。在我的计算机上,查到的Frequency为3579545。即一秒提供的嘀嗒数。再用QueryPerformanceCounter()记下先后的counter,就可以算出流失的时间了。我写了一个大循环,然后用GetTickCount()和QueryPerformance的方法一起计了一下时,GetTickCount()为31ms,后一种方法可以精确到27.349ms。

5. timeGetSystemTime()另一个得到高精度时间的方法:试了一下,的确大大强于GetTickCount(),不过似乎还是比QueryPerformance的方法差了一点。

6. GetProcessorInfo() 和SetThreadAffinityMask(): GetSystemInfo()还能看出点头绪,这个GetProcessorInfo()怎么用?回来再研究吧。

7. GetCPUTickCount(); 得到CPU核心运行周期数。

还是有很多东西不甚明了,暂时承认我不精通WINDOWS。

 

    原文作者:houxiangxiang
    原文地址: https://blog.csdn.net/houhouzhe/article/details/6689487
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞