草庐IT

swift - MacOS 上最准确的计时器

coder 2023-09-07 原文

我有一个应用程序可以从连接到 Mac 的 USB 传感器读取环境数据。用户能够配置应用程序对数据进行采样的频率以及应用程序对这些样本进行平均并将平均值记录到文件中的频率。

我第一次使用 NSTimer 但那非常不准确,尤其是当显示器进入休眠状态时。我现在正在使用 DispatchSourceTimer,但它仍然大约每 21-23 秒损失 1 毫秒,大约每 6 小时左右损失 1 秒。我希望每天的时间少于 1 秒。

我有什么想法可以让计时器更准确一点吗?

func setupTimer() -> DispatchSourceTimer {
    let timer = DispatchSource.makeTimerSource(flags: .strict, queue: nil)
    let repeatInterval = DispatchTimeInterval.seconds(samplingInterval)
    let deadline : DispatchTime = .now() + repeatInterval
    timer.schedule(deadline: deadline, repeating: repeatInterval, leeway: .nanoseconds(0))
    timer.setEventHandler(handler: self.collectPlotAndLogDatapoint)
    return timer
}

func collectPlotAndLogDatapoint() {
    samplingIntervalCount += 1
    let dataPoint : Float = softwareLoggingDelegate?.getCurrentCalibratedOutput() ?? 0
    accumulatedTotal += dataPoint
    if samplingIntervalCount == loggingInterval / samplingInterval{
        let average = self.accumulatedTotal/Float(self.samplingIntervalCount)
        DispatchQueue.global().async {
            self.logDataPoint(data: average)
            self.chartControls.addPointsToLineChart([Double(average)], Date().timeIntervalSince1970)
            self.samplingIntervalCount = 0
            self.accumulatedTotal = 0
        }
    }
}

最佳答案

对此的回答(以及回应的评论)似乎表明在 Swift 中很难获得亚毫秒级的精度:

How do I achieve very accurate timing in Swift?

Apple 显然对高精度计时器有自己的注意事项:https://developer.apple.com/library/archive/technotes/tn2169/_index.html

对于环境传感器来说,每天大约 3-4 秒是相当准确的,我想这只会证明对于那些想要以 < 1="" 秒的间隔进行采样的用户来说是一个问题(甚至是值得注意的)。="">

关于swift - MacOS 上最准确的计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53397513/

有关swift - MacOS 上最准确的计时器的更多相关文章

  1. ruby - Ruby 性能中的计时器 - 2

    我正在寻找一个用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

  2. ruby - 找不到 macOS Mojave 'ruby/config.h' 文件 - 2

    当我尝试在macOSMojave(10.14.1)上构建带有ruby​​支持(--enable-rubyinterp)的vim(8.1.0509)时,出现错误:Infileincludedfrom/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby.h:33:/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/ruby/ruby.h:24:10:fatalerror:'ru

  3. ruby - 无法在 MacOS 10.14.2 Mojave : Error running '__rvm_make -j4' 上使用 RVM 安装任何 Ruby - 2

    将MacOS升级到10.14.2Mojave后,我无法再使用RVM安装任何Ruby版本。它总是给出这样的错误:$rvminstall2.5.3ruby-2.5.3-#removingsrc/ruby-2.5.3..Searchingforbinaryrubies,thismighttakesometime.Nobinaryrubiesavailablefor:osx/10.14/x86_64/ruby-2.5.3.Continuingwithcompilation.Pleaseread'rvmhelpmount'togetmoreinformationonbinaryrubies.Ch

  4. ruby-on-rails - macOS 10.12 Sierra 上的 bundle 错误 - 2

    Ignoringbinding_of_caller-0.7.2becauseitsextensionsarenotbuilt.Try:gempristinebinding_of_caller--version0.7.2Ignoringbyebug-9.0.6becauseitsextensionsarenotbuilt.Try:gempristinebyebug--version9.0.6Ignoringcapybara-webkit-1.11.1becauseitsextensionsarenotbuilt.Try:gempristinecapybara-webkit--versio

  5. ruby - 将 OSX 更新到 10.13 (macOS High Sierra) 后不编译 SCSS - 2

    考拉版本:2.2.0Errormessage:/scss/styles.scss/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/2.3.0/rubygems/dependency.rb:319:into_specs':Couldnotfind'sass'(>=0)among15totalgem(s)(Gem::LoadError)Checkedin'GEM_PATH=/Users/monstercritic/.gem/ruby/2.3.0:/Library/Ruby/Gems/2.3.0:/Syst

  6. ruby-on-rails - 遵循 DCI 设计时在哪里进行验证? - 2

    我正在按照DCI构建新Rails应用程序的行为,但我对将验证放在哪里有一些疑问。传统上,如果您要使用ActiveRecord模型管理您的数据,验证是在继承自AR的特定类中定义的,并且它们似乎适合作为数据层的一部分。然而,在我看来,只在特定角色下进行某些验证是有意义的,并且只有当对象在该上下文中时才应检查它们,在所有其他情况下都将被忽略。这基本上意味着这些验证应该在特定角色上定义,并且当对象在有意义的上下文中使用时,应该使用这些角色模块扩展对象。您认为将这些验证保留在角色上是个好主意吗?如果是这样,您如何声明它们而不污染与对象相同的类的其他实例?如果我想使用ActiveRecord验证,

  7. ruby - 无法通过 rbenv macOS High Sierra 安装 ruby​​ 2.5.0 - 2

    我正在使用macOSHighSierra并一直在尝试通过rbenv安装ruby​​2.5.0但不断收到如下错误AppleLLVMversion9.0.0(clang-900.0.39.2)Target:x86_64-apple-darwin17.4.0Threadmodel:posixInstalledDir:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bincompiling./main.ccompilingdmydln.ccompilingminiinit.cc

  8. C#初级_定时器 - 2

    文章目录一、引言二、Timers1.System.Threading.Timer1.1.简单使用1.2.注意点2.System.Timers.Timer2.1.概述🔺2.2.注意点三、总结一、引言在开发中,会遇到并行处理的需求。有时只需要使用task(底层是创建个线程)来处理一下就好了。而有时则在并行处理的基础上还有时间的要求,较常见的就是每隔一定时间处理一次。当然,这用task肯定可以实现,但是时间这块得自己控制,无疑增加了工作量和不确定性。.NET提供了叫做定时器(timer,也叫计时器)的类,它在并行处理的基础上,带了时间参数的设置,可以满足这一需求。其实本文标题与其叫C#定时器,不如叫

  9. ruby - 我如何让 IntelliJ 在 MacOS X 上获取我的环境变量? - 2

    我尝试使用RCenvironment、.bashrc、.MacOSX/environment.plist和/etc/launchd.conf设置这些并重新启动计算机....IntelliJ仍然没有获取我的环境变量:gem文件p"ENVIRONMENT:#{ENV['VAR_PRIVATE_GEM_USERNAME']}"#输出"ENVIRONMENT:" 最佳答案 查看相关问题:https://apple.stackexchange.com/q/51677https://apple.stackexchange.com/q/57385

  10. jquery - 世界上最愚蠢的人(我)的 Rails 教程? - 2

    我很难找到符合我要求的Rails教程(或书籍也很棒):愚蠢Ruby1.9或最新的1.8MySQL一个游戏(简单的掷骰子游戏)JQuery前端谢谢! 最佳答案 RailsforDummies如果愚蠢是一个主要问题,这可能是您最好的选择。 关于jquery-世界上最愚蠢的人(我)的Rails教程?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/3841475/

随机推荐