11 Stimmen

Was ist der Leistungsunterschied zwischen Blöcken und Rückrufen?

Die in Snow Leopard eingeführten Blockobjekte eignen sich u. a. für Situationen, die früher mit Rückrufen gehandhabt wurden. Die Syntax ist viel sauberer für die Weitergabe von Kontext. Ich habe jedoch noch keine Informationen über die Auswirkungen der Verwendung von Blöcken auf die Leistung gesehen. Was, wenn überhaupt, Leistung Fallstricke sollte ich für die Verwendung von Blöcken zu suchen, insbesondere als Ersatz für eine C-Stil Callback?

11voto

Jeremy W. Sherman Punkte 35413

Die Laufzeit der Blöcke sieht ziemlich eng aus. Blockdeskriptoren und Funktionen werden statisch zugewiesen, so dass sie die Arbeitsmenge Ihres Programms vergrößern können, aber Sie "zahlen" nur für die Variablen, die Sie aus dem umschließenden Bereich referenzieren, an Speicherplatz. Nicht-globale Blockliterale und __block Variablen werden ohne Verzweigung auf dem Stack konstruiert, so dass es kaum zu einer Verlangsamung kommen dürfte. Das Aufrufen eines Blocks ist einfach result = (*b->__FuncPtr)(b, arg1, arg2) ; dies ist vergleichbar mit result = (*callback_func_ptr)(callback_ctx, arg1, arg2) .

Wenn Sie sich Blöcke als "Rückrufe, die ihre eigene Kontextstruktur schreiben und das hässliche Packen, die Speicherverwaltung, das Casting und die Dereferenzierung für Sie erledigen" vorstellen, werden Sie feststellen, dass Blöcke zur Laufzeit nur geringe Kosten verursachen und eine enorme Einsparung an Programmierzeit bedeuten.

6voto

shosti Punkte 7242

Vielleicht möchten Sie sich informieren über dieser Blogbeitrag y celui-ci . Blöcke sind wie Objective-C-Objekte implementiert, können aber auf den Stack gelegt werden, müssen also nicht unbedingt malloc (wenn Sie einen Verweis auf einen Block beibehalten, wird er allerdings auf den Heap kopiert). Sie werden daher wahrscheinlich besser als die meisten Objective-C-Objekte durchführen, aber haben eine leichte Leistung Hit im Vergleich zu einem einfachen Rückruf - ich würde schätzen, es sollte nicht ein Problem 95% der Zeit sein.

0 Stimmen

Gute Entscheidung für die Stellen von Mike Ash.

0 Stimmen

Eine Sache, die auch zu erwähnen ist, ist der Erfassungsmechanismus mit Blöcken im Vergleich zu Rückrufen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X