Grand Central Dispatch vs NSThreads?
J'ai cherché une variété de sources, mais je ne comprends pas vraiment la différence entre l'utilisation de NSThreads
et PGCD. Je suis complètement nouveau pour la plateforme OS X, donc je suis peut-être complètement mauvaise interprétation de ce.
De ce que j'ai lu en ligne, PGCD semble faire exactement la même chose que de base les threads POSIX (, NSThreads
etc.) lors de l'ajout de beaucoup plus de jargon technique ("blocs"). Il semble juste compliquer la base de création de thread système (créer de thread, la fonction d'exécution).
Exactement quel est le PGCD et pourquoi serait-il jamais être privilégiées par rapport à la traditionnelle threading? Quand doit traditionnelle de threads à utiliser plutôt que de PGCD? Et enfin, est-il une raison pour PGCD est étrange syntaxe? ("blocs" au lieu de simplement les appels de fonctions).
Je suis sur Mac OS X 10.6.8 Snow Leopard et je ne suis pas de programmation pour iOS - je suis de programmation pour les Mac. J'utilise Xcode 3.6.8 dans le Cacao, la création d'une application graphique.
- Juste une remarque: PGCD permet l'utilisation de fonctions si vous les préférez plus de blocs.
- Il y a vraiment de bonnes vidéos sur l'Apple Developer Connection (gratuitement) sur ce sujet - les vérifier!
Vous devez vous connecter pour publier un commentaire.
Avantages de l'Envoi
Les avantages de l'envoi sont principalement décrites ici:
La migration Loin de Threads
L'idée est que vous éliminer le travail sur votre partie, puisque le paradigme correspond à la PLUPART des code plus facilement.
Empiriquement, à l'aide d'un PGCD de type de verrouillage au lieu de
@synchronized
est environ 80% plus rapide ou plus, bien que la micro-benchmarks peuvent être trompeurs. Lire plus ici, mais je pense que les conseils d'aller asynchrone avec écrit ne s'applique pas dans de nombreux cas, et c'est plus lent (mais c'est asynchrone).Avantages des Threads
Pourquoi voudriez-vous continuer à utiliser les Threads? De la même document:
Un autre endroit où je n'ai personnellement pas trouvé une solution idéale à l'aide de files d'attente est de démon de processus qui doivent être constamment reportée. Pas que vous ne pouvez pas la modifier, mais en boucle à l'intérieur d'un NSThread méthode est plus simple (je pense). Edit: Maintenant, je suis convaincu que, même dans ce contexte, le PGCD de style de verrouillage serait plus rapide, et vous pouvez également faire une boucle à l'intérieur d'un PGCD-expédié de fonctionnement.
Blocs en Objective-C?
Blocs sont vraiment horrible en Objective-C, à cause de l'horrible syntaxe (si Xcode peut parfois aider avec l'auto-complétion, au moins). Si vous regardez les blocs en Ruby (ou toute autre langue, à peu près), vous allez voir comment simple et élégant, ils sont pour les opérations d'envoi. Je dirais que vous aurez l'habitude de l'Objectif-la syntaxe du C, mais je pense vraiment que vous aurez utilisé pour la copie de vos exemples beaucoup 🙂
Vous pourriez trouver mes exemples à partir d'ici pour être utile, ou tout simplement de distraire. Pas sûr.
Alors que les réponses sont sur le contexte de threads vs PGCD à l'intérieur du domaine d'une seule application, et les différences qu'elle a pour la programmation, la raison pour laquelle vous devez toujours préférer le PGCD est parce que des environnements multitâches (puisque vous êtes sur MacOSX et pas iOS). Les fils sont ok si votre application est en cours d'exécution seul sur votre machine. Dites, vous avez une vidéo de l'édition du programme et voulez appliquer des effets à la vidéo. Le rendu va prendre 10 minutes sur une machine avec huit cœurs. Des beaux.
Maintenant, alors que l'application vidéo est barattage dans le fond, vous ouvrez un programme d'édition d'image et de jouer avec l'image en haute résolution, décider d'appliquer certaines spécial filtre d'image et de votre image de l'application intelligent détecte que vous avez huit cœurs et commence à huit threads pour traiter l'image. Nice n'est-ce pas? Sauf que c'est terrible pour la performance. L'image de l'édition appli ne sais rien à propos de l'application vidéo (et vice versa) et, par conséquent, les deux demande de respectivement en nombre optimum de threads. Et il y aura de la douleur et de sang, tandis que les noyaux essaie de passer de l'un thread à l'autre, parce que pour éviter la famine, le CPU va finir par se laisser tous les threads de s'exécuter, même si dans cette situation, il serait plus optimal pour exécuter seulement 4 threads pour l'application vidéo et 4 threads pour l'image de l'app.
Pour plus de détails référence, jetez un oeil à http://deusty.blogspot.com/2010/11/introducing-gcd-based-cocoahttpserver.html où vous pouvez voir une référence d'un serveur HTTP à l'aide de PGCD contre le fil, et de voir comment il évolue. Une fois que vous comprenez le problème des threads pour le multicœur machines multi-application des environnements, vous voulez toujours utiliser le PGCD, tout simplement parce que les threads ne sont pas toujours optimales, tandis que PGCD peut potentiellement être depuis l'OS pouvez mettre à l'échelle l'utilisation du thread par application en fonction de la charge.
S'il vous plaît, rappelez-vous que nous n'aurons pas plus d'GHz dans nos machines tout moment bientôt. À partir de maintenant nous n'avons plus de cœurs, de sorte qu'il est de votre devoir d'utiliser le meilleur outil pour ce milieu, et qui est le PGCD.
@synchronized
: fieryrobot.com/blog/2010/09/01/... (ignorer les conseils de l'auteur pour utiliser asynchrone setters si elles ne s'appliquent pas à votre cas)Blocs de permettre le passage d'un bloc de code à exécuter. Une fois passé le "étrange syntaxe", ils sont très puissants.
PGCD utilise également les files d'attente qui s'il est utilisé correctement peut aider avec lock gratuit la simultanéité si le code en cours d'exécution dans le des files d'attente distinctes sont isolés. C'est une façon plus simple d'offrir de fond et de la concurrence, tout en minimisant la possibilité pour les blocages (si utilisé).
L ' "étrange syntaxe" est parce qu'ils ont choisi l'accent circonflexe (^) parce que c'était l'un des rares symboles qui n'était pas surchargé comme un opérateur en C++
Voir:
https://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html
PGCD (Grand Central Dispatch): PGCD fournit et gère les files d'attente FIFO à laquelle votre application peut envoyer des tâches sous la forme de bloc objets. Travaux soumis à expédier les files d'attente sont exécutées sur un pool de threads entièrement géré par le système. Aucune garantie n'est faite que pour le thread sur lequel une tâche s'exécute. Pourquoi PGCD plus de threads :
La quantité de travail que vos cœurs du PROCESSEUR sont en train de faire
Combien de cœurs de PROCESSEUR que vous avez.
Combien de threads doit être généré.
Si PGCD des besoins elle peut descendre dans le noyau et communiquer sur les ressources, assurant ainsi une meilleure planification.
Moins de charge sur le noyau et une meilleure synchronisation avec les OS
PGCD utilise les threads du pool de threads au lieu de créer puis de détruire.
Meilleur parti du matériel du système des ressources, tout en permettant au système d'exploitation à l'équilibre de la charge de tous les programmes en cours d'exécution avec des considérations de ce type de chauffage et la vie de la batterie.
J'ai partagé mon expérience avec les threads, système d'exploitation et PGCD À http://iosdose.com