草庐IT

windows - Windows 7之前的计时器合并

coder 2024-06-17 原文

在Windows7和Windows8中有定时器合并支持,请参见以下示例:Timer coalescing in .net
windows 7有一个SetWaitableTimerEx函数,据称它支持合并herehere
windows 8还有一个SetCoalescableTimer函数,根据msdn支持合并。
所以很多人都在谈论windows 7和windows 8中的定时器合并。但后来看来,它可能已经提前实施了。是这样吗?
首先,SetThreadpoolTimer available since Vista在vista下提供计时器合并是否正确。或者它只提供接口,实际上只在Windows7之后实现合并?
"Thread Pool Timers and I/O"我可以看到
“这实际上是一个影响能效并有助于降低总体功耗的功能。它是基于一种叫做定时器合并的技术。”
这句话对所有支持SetThreadpoolTimer功能的windows版本都正确吗?
其次,现在我开始想。我可以看到timeSetEvent available since XP有一个名为uResolution的参数。这个参数是否只是像timeBeginPeriod那样改变全局计时器的分辨率,在计时器事件等待期间,还是只影响这个特定的计时器,同时提供计时器合并?
最后,在windows xp或vista下,是否有其他或替代的函数提供计时器合并?

最佳答案

总的来说有几句话:
定时器合并提供了一种减少中断次数的方法。允许应用程序指定其计时要求的公差。这允许操作系统“批处理”中断,并产生以下几个后果:
中断次数可能会减少。(+)
上下文开关的数量可能更低。(+)
可以降低功耗。(+)
大量的操作可能必须在这些分批中断处完成。
调度程序此时可能必须调度大量进程(—)
时间分辨率更差(-)
windows以及其他基于中断的操作系统总是对定时事件进行批处理。任何设置为在特定时间发生的事件都依赖于到期时间和中断。因此,事件与中断合并。该方案的粒度由中断频率决定。对定时器合并感兴趣的人必须阅读:MSDN: Windows Timer Coalescing
出于性能原因,应尽一切努力减少中断次数
尽可能多。不幸的是,许多软件包确实将系统计时器的分辨率设置得非常高,例如,通过多媒体计时器接口timeBeginPeriod/timeEndPeriod或底层apiNtSetTimerResolution。正如汉斯所提到的:“chrome”是一个很好的例子,说明如何严重夸大这些功能的使用。
其次,现在我开始想…timeSetEvent是多媒体计时器功能之一。它在引擎盖下使用timeBeginPeriod
而且它使用不当:它将系统计时器分辨率设置为在执行平台上可用的计时器分辨率范围内尽可能匹配uResolution。在udelay的大值上,它可以在低分辨率下等待,直到接近延迟到期,然后才提高系统计时器分辨率,但它将整个等待期间的计时器分辨率设置为指定的uresolution。这是很痛苦的,因为我们知道高分辨率也会导致长时间的延迟。然而,多媒体定时器功能并不适合大延迟使用。但是反复设置分辨率也不好(见下面的注释)。
关于timeSetEvent的摘要:这个函数根本不做像合并这样的事情,它做的恰恰相反:它可以选择性地增加中断的数量;在这个意义上,它将事件分散到更多的中断上,它“去批处理”它们。
SetThreadpoolTimer首次引入了“批处理”事件的概念。这主要是由于越来越多的关于windows笔记本电脑电池寿命的投诉。SetWaitableTimerEx进一步推动了这一策略,SetCoalescableTimer是访问凝聚计时器的最新api。后者引入了timerv_default_coalescing和timerv_no_coalescing,这是值得考虑的,因为它们允许忽略某些事实。
利用这个机会对系统计时器分辨率做一些说明:
改变系统定时器分辨率比增加中断频率有更多的用途。使用timeBeginPeriod/NtSetTimerResolution会产生一些效果:
中断频率变化
线程数量更改(线程时间片)(!)
系统时间打嗝(MSDN: "...frequent calls can significantly affect the system clock"
系统时间调整激活时出现打嗝(SetSystemTimeAdjustment
要点3。在Windows 7和Point 4中部分得到了处理。只有8.1号窗口的地址。
系统时间的中断可能与支持的最小计时器分辨率(典型系统为15.625 ms)一样大,并且它们在频繁timeBeginPeriod/NtSetTimerResolution时累积。当试图调整系统时间以匹配NTP引用时,这可能会导致相当大的跳跃。NTP客户端在Windows版本
最后:windows本身在看到优点时会更改系统计时器的分辨率。支持的计时器分辨率的数量取决于底层硬件和Windows版本。可用分辨率的列表可以通过调用timeBeginPeriod并增加周期,然后调用NtQueryTimerResolution来扫描它们。某些受支持的解决方案可能会被特定平台上的Windows“不喜欢”,并经过修改以更好地适应Windows的需要。示例:在某些平台上,xp可能会在短时间后将~4 ms的“用户设置”分辨率更改为1 ms。特定Windows版本<>
如果一个应用程序需要完全独立于这些手工艺品,它必须获得最高的可用分辨率自己。这样应用程序就控制了整个系统的分辨率,而不必为其他应用程序或操作系统更改计时器分辨率而烦恼。更现代的平台确实支持0.5毫秒的计时器分辨率。timeBeginPeriod不允许获取此分辨率,但NtSetTimerResolution可以。Here我已经描述了如何使用ntsettimerresolution获得0.5 ms的分辨率。
在这种情况下,功耗可能会增加,但这是为可靠的分辨率而支付的费用:在现代硬件上,上下文切换的能量成本通常为0.05兆焦耳到0.2兆焦耳(有人估计过全球每年上下文切换的总量吗?)。当计时器分辨率设置为最大值时,Windows将线程数量(时间片)削减到大约2/3。因此,耗电量增加了约30%!

关于windows - Windows 7之前的计时器合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23689510/

有关windows - Windows 7之前的计时器合并的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby - 如果指定键的值在数组中相同,如何合并哈希 - 2

    我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat

  3. ruby - 如何在 Rails 4 中使用表单对象之前的验证回调? - 2

    我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser

  4. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  5. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

  6. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  7. git使用常见问题(提交代码,合并冲突) - 2

    文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g

  8. ruby-on-rails - 如何处理 Grape 中特定操作的过滤器之前? - 2

    我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?

  9. ruby-on-rails - 在 Ruby on Rails 中发送响应之前如何等待多个异步操作完成? - 2

    在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.

  10. Ruby 哈希直接访问与合并 - 2

    有什么区别:@attr[:field]=new_value和@attr.merge(:field=>new_value) 最佳答案 如果您使用的是merge!而不是merge,则没有区别。唯一的区别是您可以在合并参数中使用多个字段(意思是:另一个散列)。例子:h1={"a"=>100,"b"=>200}h2={"b"=>254,"c"=>300}h3=h1.merge(h2)putsh1#=>{"a"=>100,"b"=>200}putsh3#=>{"a"=>100,"b"=>254,"c"=>300}h1.merge!(h2)pu

随机推荐