Как я могу замедлить задачи параллельной очереди GCD? - PullRequest
3 голосов
/ 30 марта 2019

В целях отладки производительности мне нужно следить за ходом обновления моего пользовательского интерфейса всякий раз, когда фоновая задача, управляемая очередью параллелизма GCD, завершает одну из своих задач.

Без искусственной задержки это очень сложноследить за происходящим и реагировать на него.

Каждая задача занимает, возможно, 10 мс.Мне нравится, что вместо этого требуется одна секунда.

Я попытался замедлить задачу очереди, добавив к ней sleep(1);, но это позволит запускать другие ожидающие задачи.

Что мне нужнов том, что каждая задача действительно занимает свою очередь до тех пор, пока эта дополнительная секунда не закончится.

Как мне это сделать без необходимости реорганизовать весь мой код очереди?В конце концов, это только для отладки, и я хотел бы просто вставить этот код с условной компиляцией вместо того, чтобы заканчивать с другим кодом для отладочной и не отладочной сборок.

Ответы [ 2 ]

1 голос
/ 30 марта 2019

Тем временем я также придумал способ, практически такой же, как у Роба, убив время в цикле:

mach_timebase_info_data_t tb;
mach_timebase_info (&tb);
double tbScale = 1.0 / (1e-9 * (double)tb.numer / (double)tb.denom);
uint64_t now, end = mach_absolute_time();
end += tbScale * 0.5; // -> wait 0.5 sconds
do {
    now = mach_absolute_time();
} while (now < end);
1 голос
/ 30 марта 2019

Вы можете вращаться в течение определенного периода времени, например:

func spin(for interval: CFTimeInterval) {
    let start = CACurrentMediaTime()
    while (CACurrentMediaTime() - start) < interval { }
}

Таким образом, чтобы сохранить поток занятым в течение 1 секунды, это будет:

spin(for: 1)

Вы 'никогда не делаю этого в производственном приложении, но оно может служить вашим диагностическим целям.

...