我想描述软件计时器的准确性。我不太关心它有多准确,但确实需要知道准确度是多少。
我研究了 c 函数 clock() 和 WinAPI 的函数 QPC 和 timeGetTime,我知道它们都依赖于硬件。
我正在测量一个可能需要大约 5-10 秒的过程,我的要求很简单:我只需要 0.1 秒的精度(分辨率)。但我确实需要知道最坏情况下的准确度。
虽然更高的准确性是首选,但我宁愿知道准确性很差(500 毫秒)并解释它,也不愿相信准确性更好(1 毫秒)但无法记录它。
有人对如何表征软件时钟精度有什么建议吗?
谢谢
最佳答案
您需要区分准确性、分辨率和延迟。
clock()、GetTickCount 和 timeGetTime() 源自经过校准的硬件时钟。分辨率不是很好,它们由时钟滴答中断驱动,默认情况下每秒滴答 64 次或每 15.625 毫秒滴答一次。您可以使用 timeBeginPeriod() 将其降低到 1.0 毫秒。准确性非常好,时钟是从 NTP 服务器校准的,您通常可以指望它在一个月内不会超过一秒。
QPC 具有更高的分辨率,总是优于 1 微秒,在某些机器上甚至低至半纳秒。然而,它的准确性很差,时钟源是从某处芯片组获取的频率。它未经校准,具有典型的电子公差。仅将其用于短时间间隔。
在处理时序时,延迟是最重要的因素。如果您不能足够快地读取它,那么您就没有用高度准确的定时源。当您在保护模式操作系统上以用户模式运行代码时,这始终是一个问题。它始终具有比您的代码运行优先级更高的代码。特别是设备驱动程序是麻烦制造者,尤其是视频和音频驱动程序。您的代码也可能会被换出 RAM,需要页面错误才能重新加载。在负载很重的机器上,无法在数百毫秒内运行您的代码并不罕见。您需要将这种故障模式考虑到您的设计中。如果您需要保证亚毫秒级精度,那么只有具有实时优先级的内核线程才能满足您的要求。
一个相当不错的计时器是您从 timeSetEvent() 获得的多媒体计时器。它旨在为需要可靠计时器的程序提供良好的服务。你可以让它在 1 毫秒内滴答作响,它会尽可能 catch 延迟。请注意,它是一个异步计时器,回调是在一个单独的工作线程上进行的,因此您必须小心处理适当的线程同步。
关于c++ - 计时器精度 : c clock( ) vs. WinAPI 的 QPC 或 timeGetTime( ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18346879/
在railstutorial中,作者为什么选择使用这个(代码list10.25):http://ruby.railstutorial.org/chapters/updating-showing-and-deleting-usersnamespace:dbdodesc"Filldatabasewithsampledata"task:populate=>:environmentdoRake::Task['db:reset'].invokeUser.create!(:name=>"ExampleUser",:email=>"example@railstutorial.org",:passwo
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
我正在尝试使用正则表达式验证美元金额:^[0-9]+\.[0-9]{2}$这工作正常,但每当用户提交表单并且美元金额以0(零)结尾时,ruby(或rails?)将0砍掉。所以500.00变成500.0,因此正则表达式验证失败。有没有办法让ruby/rails保持用户输入的格式,而不管尾随零? 最佳答案 我假设您的美元金额是小数类型。因此,用户在字段中输入的任何值在保存到数据库之前都会从字符串转换为适当的类型。验证适用于已转换为数字类型的值,因此在您的情况下,正则表达式并不是真正合适的验证过滤器。不过,您有几种可能性可以解决这个问
我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“
我正在寻找一个用ruby演示计时器的在线示例,并发现了下面的代码。它按预期工作,但这个简单的程序使用30Mo内存(如Windows任务管理器中所示)和太多CPU有意义吗?非常感谢deftime_blockstart_time=Time.nowThread.new{yield}Time.now-start_timeenddefrepeat_every(seconds)whiletruedotime_spent=time_block{yield}#Tohandle-vesleepinteravalsleep(seconds-time_spent)iftime_spent
给定一个元素和一个数组,Ruby#index方法返回元素在数组中的位置。我使用二进制搜索实现了我自己的索引方法,期望我的方法会优于内置方法。令我惊讶的是,内置的在实验中的运行速度大约是我的三倍。有Rubyist知道原因吗? 最佳答案 内置#indexisnotabinarysearch,这只是一个简单的迭代搜索。但是,它是用C而不是Ruby实现的,因此自然可以快几个数量级。 关于Ruby#index方法VS二进制搜索,我们在StackOverflow上找到一个类似的问题:
有没有办法让Ruby能够做这样的事情?classPlane@moved=0@x=0defx+=(v)#thisiserror@x+=v@moved+=1enddefto_s"moved#{@moved}times,currentxis#{@x}"endendplane=Plane.newplane.x+=5plane.x+=10putsplane.to_s#moved2times,currentxis15 最佳答案 您不能在Ruby中覆盖复合赋值运算符。任务在内部处理。您应该覆盖+,而不是+=。plane.a+=b与plane.a=