我构建了一个必须以非常高的准确度执行某项任务的应用程序(接受错误为+/- 0.001s)。我知道这很大程度上取决于实际的任务,但即使是最基本的任务,我也无法做到足够精确。我在一个单独的线程上使用while循环(使用NSOperation),如下面的代码所述。我遇到的问题是,尽管任务以低速重复,但错误对于连续步骤来说非常大,为0.02或0.01(见第二部分)。
while (!self.isCancelled) {
NSLog(@"run");
[NSThread sleepForTimeInterval:0.5];
}
输出是:
2011-03-26 12:17:03.836 Test[388:c6c7] run
2011-03-26 12:17:04.344 Test[388:c6c7] run
2011-03-26 12:17:04.852 Test[388:c6c7] run
2011-03-26 12:17:05.373 Test[388:c6c7] run
2011-03-26 12:17:05.880 Test[388:c6c7] run
2011-03-26 12:17:06.381 Test[388:c6c7] run
2011-03-26 12:17:06.904 Test[388:c6c7] run
了解误差如何从0.01s变为0.02s。例如,在6.381和6.904之间的时间 0.523
这是因为调试打印时间开销?有没有办法更好地测试它?这可以以某种方式得到改善吗?我很确定我没有做正确的事情,这个错误对于这样的节奏来说是很大的。
答案 0 :(得分:4)
如果您希望每隔一段时间重复一次,可以使用:
scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:
我认为您的代码问题可能是它正在执行,然后在0.5秒后定时关闭,因此实际时间间隔为executionTimeForFunction + 0.5
。
就此而言,我似乎记得NSLog
实际上很慢。
答案 1 :(得分:1)
这不是实时操作系统。 1ms是不现实的。