советы по оптимизации быстрых повторяющихся звонков (Objective-C, iPhone)? - PullRequest
1 голос
/ 26 марта 2011

Я создаю приложение, которое должно выполнять определенную задачу с очень высокой точностью с течением времени (допустимая ошибка составляет +/- 0,001 с).Я знаю, что это очень сильно зависит от реальных задач, однако я не могу сделать это достаточно точным даже для самой основной задачи.Я использую цикл 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,01 до 0,02 с.Например, время между 6.381 и 6.904 составляет 0.523.

Это из-за накладных расходов на отладочную печать?Есть ли способ проверить это лучше?Можно ли это как-то улучшить?Я почти уверен, что не делаю что-то правильно, ошибка слишком велика для такого темпа.

Ответы [ 2 ]

4 голосов
/ 26 марта 2011

Если вы хотите, чтобы это повторялось с интервалом, вы можете использовать это:

scheduleTimerWithTimeInterval: target: selector: userInfo: repeat:

Я думаю, что проблемас вашим кодом может быть то, что он исполняется, затем получает время выключиться через 0,5 секунды, поэтому фактический временной интервал составляет executionTimeForFunction + 0.5.

На этой ноте я, кажется, помнюNSLog на самом деле довольно медленно.

1 голос
/ 26 марта 2011

Это не ОС реального времени. 1 мс нереально.

...