Если dispatch_sync не использует другой поток, может ли он быть быстрее?

Я запускаю этот код

dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
      NSLog(@"Main Thread? %d", [NSThread isMainThread]);
      // non-trivial non-UI code here

});

NSLog указывает, что я нахожусь в основном потоке, но... мое впечатление, что нетривиальный не-пользовательский код работает намного быстрее, если я использую dispatch_sync (в отличие от ничего).

Если он работает в основном потоке, может ли он быть быстрее?

Ответ 1

В глобальных параллельных очередях GCD нет порядка, передавая один из них dispatch_sync() noop и dispatch_sync() будет просто выполнять указанный блок непосредственно в этом случае, как если бы вы написали

^{...}();

Ответ 2

Ограничивая количество запущенных потоков, технически уверен, что вы можете повысить производительность, однако это не рекомендуется. Если у вас есть задание, на которое потребуется значительное количество времени (существенное значение будет влиять на пользовательский интерфейс), просто используйте новый поток, используя dispatch_async или встроенный блок (закрытие). Лучшим вариантом является оптимизация вашего алгоритма для улучшения длины вашей задачи.

Вы не заметите существенной разницы в скорости, запустив основной поток.