La simple vérité est que NSLog est tout simplement lent.
Mais pourquoi? Pour répondre à cette question, découvrons ce que fait NSLog, puis comment il le fait.
Que fait exactement NSLog?
NSLog fait 2 choses:
Il écrit les messages de journal dans la fonction Apple System Logging (asl). Cela permet aux messages du journal de s'afficher dans Console.app. Il vérifie également si le flux stderr de l'application va à un terminal (par exemple, lorsque l'application est exécutée via Xcode). Si tel est le cas, il écrit le message de journal dans stderr (pour qu'il apparaisse dans la console Xcode).
Ecrire sur STDERR ne semble pas difficile. Cela peut être accompli avec fprintf et la référence de descripteur de fichier stderr. Mais qu'en est-il de l'asl?
La meilleure documentation que j'ai trouvée sur ASL est un article de blog en 10 parties de Peter Hosey: lien
Sans entrer dans les détails, le point fort (en ce qui concerne les performances) est le suivant:
Pour envoyer un message de journal au service ASL, vous ouvrez essentiellement une connexion client au démon ASL et envoyez le message. MAIS - chaque thread doit utiliser une connexion client distincte. Par conséquent, pour être thread-safe, chaque fois que NSLog est appelé, il ouvre une nouvelle connexion client asl, envoie le message, puis ferme la connexion.
Les ressources peuvent être trouvées ici et ici .