2010-04-21 5 views
11

Jedną z rzeczy, które blokują obiekty wprowadzone w Snow Leopard, są dobre sytuacje, które wcześniej były obsługiwane za pomocą wywołań zwrotnych. Składnia jest znacznie czystsza dla przekazywania kontekstu. Jednak nie widziałem żadnych informacji na temat skutków wydajności używania bloków w ten sposób. Jakich, jeśli w ogóle, pułapek wydajności powinienem uważać podczas korzystania z bloków, szczególnie jako zamiennik wywołania zwrotnego w stylu C?Jaka jest różnica w wydajności między blokami i wywołaniami zwrotnymi?

Odpowiedz

11

Środowisko wykonawcze klocków wygląda dość szczelnie. Deskryptory bloków i funkcje są przydzielane statycznie, dzięki czemu mogą powiększać zestaw roboczy programu, ale "płacisz" tylko za zmienne, które przywołujesz z otaczającego zakresu. Nieglobalne czcionki blokowe i zmienne __block są konstruowane na stosie bez rozgałęzień, więc prawdopodobnie nie wystąpią spowolnienia. Wywołanie bloku to tylko result = (*b->__FuncPtr)(b, arg1, arg2); jest to porównywalne z result = (*callback_func_ptr)(callback_ctx, arg1, arg2).

Jeśli uważasz, że bloki to "wywołania zwrotne, które tworzą własną strukturę kontekstu i obsługują brzydkie pakowanie, zarządzanie pamięcią, odlewanie i dereferencje dla ciebie", myślę, że zdasz sobie sprawę, że bloki są niewielkim kosztem w czasie wykonywania i ogromne oszczędności czasu programowania.

6

Możesz chcieć sprawdzić this blog post i this one. Bloki są implementowane jako obiekty Objective-C, z tym wyjątkiem, że można je umieścić na stosie, więc niekoniecznie muszą być one malloc 'd (jeśli zachowasz odniesienie do bloku, zostanie ono skopiowane na stertę) . W związku z tym prawdopodobnie będą działać lepiej niż większość obiektów Objective-C, ale będą miały niewielki wpływ na wydajność w porównaniu do prostego wywołania zwrotnego - sądzę, że nie powinno to stanowić problemu w 95% przypadków.

+0

Dobre połączenie z postami Mike Ash. – Don

+0

jedną rzeczą, o której należy wspomnieć, jest mechanizm przechwytywania z blokami w porównaniu do wywołań zwrotnych. –