Grand Central Dispatch gegen NSThreads?
Suchte ich eine Vielzahl von Quellen, aber nicht wirklich verstehen, den Unterschied zwischen der Verwendung NSThreads
und GCD. Ich bin komplett neu in der OS X-Plattform, so dass ich vielleicht komplett falsch.
Von dem, was ich online gelesen, GCD scheint zu tun genau das gleiche wie basic threads (POSIX, NSThreads
etc.) während das hinzufügen von viel mehr technischen jargon ("Blöcke"). Es scheint nur verkomplizieren das grundlegende thread-creation-system (erstellen thread, die run-Funktion).
Was genau ist GCD und warum würde es jemals werden bevorzugt über traditionelle threading? Wann sollte traditionellen threads verwendet werden, anstatt GCD? Und schließlich gibt es einen Grund für GCD merkwürdige syntax? ("Blöcke" statt einfach nur den Aufruf von Funktionen).
Bin ich auf Mac OS X 10.6.8 Snow Leopard und ich bin nicht in der Programmierung für iOS - ich bin in der Programmierung für Macs. Ich bin mit Xcode 3.6.8 in Kakao, Erstellung einer GUI-Anwendung.
InformationsquelleAutor der Frage fdh | 2012-02-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vorteile Versand
Die Vorteile der Versendung sind meist die hier beschrieben werden:
Die Migration Weg von Threads
Die Idee ist, dass Sie zu beseitigen, arbeiten Sie auf Ihrem Teil, da das Paradigma passt für die MEISTEN-code leichter.
Empirisch, mit GCD-Typ sperren anstelle von
@synchronized
ist etwa 80% schneller oder mehr, obwohl die micro-benchmarks kann täuschen. Lesen Sie mehr hierobwohl ich denke, die Beratung zu gehen async mit schreibt, gilt nicht in vielen Fällen, und es ist langsamer (aber es ist asynchron).Vorteile von Threads
Warum würden Sie weiterhin zur Benutzung von Threads? Aus dem gleichen Dokument:
Anderen Ort, wo ich noch nicht persönlich gefunden, eine ideale Lösung mithilfe von Warteschlangen ist daemon-Prozesse müssen ständig neu geplant. Nicht, dass Sie nicht umplanen, aber der Schleifen in einer NSThread Methode ist einfacher (finde ich). Edit: Jetzt bin ich davon überzeugt, dass auch in diesem Kontext GCD-Stil sperren würde schneller sein, und Sie könnte auch tun, eine Schleife innerhalb eines GCD-wird ausgelöst, Betrieb.
Blöcke in Objective-C?
Blöcke sind wirklich schrecklich in Objective-C durch die schreckliche syntax (obwohl Xcode kann manchmal helfen, mit Autovervollständigung, zumindest). Wenn man sich die Blöcke in Ruby (oder jede andere Sprache ziemlich viel), du wirst sehen, wie einfach und elegant Sie sind für die Einplanung der Vorgänge. Ich würde sagen, dass Sie verwendet, um die Objective-C-syntax, aber ich glaube wirklich, dass Sie bekommen werden, verwendet, um das kopieren von deine Beispiele eine Menge 🙂
Finden Sie vielleicht meine Beispiele hierhilfsbereit zu sein, oder einfach nur ablenken. Sicher nicht.
InformationsquelleAutor der Antwort Dan Rosenstark
Während die Antworten sind so weit über den Kontext des threads vs GCD innerhalb der Domäne einer einzigen Anwendung und die Unterschiede, die Sie für die Programmierung, die Grund sollten Sie immer bevorzugen GCD ist, weil der multitasking-Umgebungen (da Sie auf Mac OS x und nicht iOS). Gewinde sind ok, wenn die Anwendung ausgeführt wird allein auf Ihrem Rechner. Sagen, Sie haben eine video-edition-Programm und wollen etwas Effekt zum video. Das Rendern dauert 10 Minuten auf einem Rechner mit acht Kernen. Fein.
Nun, während die video-app ist das Buttern im hintergrund, öffnen Sie ein Bild edition-Programm und spielen mit einigen high-resolution image, entscheiden, gelten einige spezielle Bild-filter und Bild-Anwendung wird klug erkennt, Sie haben acht Kerne und beginnt mit acht threads, die zur Verarbeitung des Bildes. Schön ist es nicht? Außer, dass ist schrecklich für die Leistung. Das Bild edition-app weiß nichts über die video-app (und Umgekehrt) und somit beide fordern Ihre jeweils optimale Anzahl von threads. Und es wird Schmerzen und Blut, während die Kerne zu wechseln versuchen, von einem thread zum anderen, weil, um zu vermeiden, Hunger die CPU schließlich wollen alle threads laufen, obwohl in dieser situation wäre es mehr optimal zu laufen, nur 4 threads für die video-app und 4 threads für die Bild-app.
Für eine ausführlichere Referenz, werfen Sie einen Blick auf http://deusty.blogspot.com/2010/11/introducing-gcd-based-cocoahttpserver.html wo Sie sehen können, ein benchmark von einem HTTP-server mit GCD versus-thread und sehen, wie es skaliert. Wenn Sie verstehen, die problem-threads für multicore-Maschinen in multi-app-Umgebungen, die Sie immer verwenden möchten, GCD, einfach weil die threads sind nicht immer optimal, während der GCD potenziell werden können, da das OS skaliert auf thread-Nutzung pro app je nach Last.
Bitte, denken Sie daran, wir haben nicht mehr GHz in unsere Maschinen in absehbarer Zeit. Von nun an werden wir nur haben, mehr Kerne, so ist es Ihre Pflicht das beste Werkzeug für diese Umgebung, und das ist GCD.
InformationsquelleAutor der Antwort Grzegorz Adam Hankiewicz
Blöcke ermöglichen die übergabe eines code-block auszuführen. Wenn Sie vorbei an der "merkwürdigen syntax", Sie sind sehr mächtig.
GCD auch mit Warteschlangen arbeitet, die, wenn Sie richtig eingesetzt, kann helfen, mit lock frei Parallelität, wenn die code-Ausführung im separaten Warteschlangen sind isoliert. Es ist eine einfachere Möglichkeit zu bieten hintergrund und Parallelität während die Minimierung der Wahrscheinlichkeit für deadlocks (wenn richtig eingesetzt).
Den "merkwürdigen syntax" ist, weil Sie wählten das caret-Zeichen ( ^ ), weil es eines der wenigen Symbole, die nicht überladen eines operators in C++
Finden Sie unter:
https://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html
InformationsquelleAutor der Antwort bryanmac
GCD (Grand Central Dispatch): GCD verwaltet und stellt FIFO-Warteschlangen, um die Sie Ihre Bewerbung senden können Aufgaben in form von block-Objekte. Arbeit vorgelegt dispatch-Warteschlangen ausgeführt werden, auf einen pool von threads, die komplett vom system verwaltet. Keine Garantie wird gemacht, um den thread auf dem eine task ausgeführt wird. Warum GCD über threads :
Wie viel Arbeit Ihre CPU-Kerne zu tun
Wie viele CPU-Kerne haben.
Wie viel threads soll hervorgebracht werden.
Wenn GCD braucht, kann es nach unten gehen in den kernel und die Kommunikation über Ressourcen, damit eine bessere Planung.
Weniger Last auf kernel-und-bessere-sync mit OS
GCD nutzt vorhandene threads aus thread-pool statt erstellen und dann zu zerstören.
Der beste Vorteil des Systems ist hardware-Ressourcen, während es dem Betriebssystem, um die balance der Belastung aller Programme, die derzeit ausgeführt werden, zusammen mit überlegungen, wie Heizung und Batterie-Leben.
Habe ich meine Erfahrung mit threads, Betriebssystem und GCD BEI http://iosdose.com
InformationsquelleAutor der Antwort Alok