Какая разница в производительности между блоками и обратными вызовами? - PullRequest
11 голосов
/ 21 апреля 2010

Одна из вещей, которые блокируют объекты, представленные в Snow Leopard, хороши для ситуаций, которые ранее обрабатывались с помощью обратных вызовов. Синтаксис намного чище для передачи контекста. Однако я не видел никакой информации о влиянии производительности на использование блоков таким способом. На какие подводные камни, связанные с производительностью, следует обращать внимание при использовании блоков, особенно в качестве замены для обратного вызова в стиле C?

Ответы [ 2 ]

11 голосов
/ 21 апреля 2010

Время выполнения блоков выглядит довольно плотно. Дескрипторы блоков и функции размещаются статически, поэтому они могут расширить рабочий набор вашей программы, но вы «платите» в хранилище только за переменные, на которые вы ссылаетесь из прилагаемой области видимости. Неглобальные литералы блоков и переменные __block создаются в стеке без каких-либо ветвлений, так что вы вряд ли столкнетесь с большим замедлением из-за этого. Вызов блока - просто result = (*b->__FuncPtr)(b, arg1, arg2); это сопоставимо с result = (*callback_func_ptr)(callback_ctx, arg1, arg2).

Если вы думаете о блоках как о «обратных вызовах, которые пишут свою собственную структуру контекста и обрабатывают уродливую упаковку, управление памятью, преобразование и разыменование для вас», я думаю, вы поймете, что блоки - это небольшие затраты во время выполнения огромная экономия времени на программирование.

6 голосов
/ 21 апреля 2010

Возможно, вы захотите проверить этот пост и этот .Блоки реализованы как объекты Objective-C, за исключением того, что они могут быть помещены в стек, поэтому они не обязательно должны быть malloc 'd (если вы сохраните ссылку на блок, он будет скопирован в кучу,хоть).Таким образом, они, вероятно, будут работать лучше, чем большинство объектов Objective-C, но будут иметь небольшое снижение производительности по сравнению с простым обратным вызовом - я думаю, это не должно быть проблемой в 95% случаев.

...