2010-11-08 28 views
6

En tant que programmeur plus récent, j'ai découvert la magie de NSlog, et l'utilise tout au long de mon code. Il a été extrêmement utile (avec NSZombieEnabled) dans le débogage.L'utilisation de NSLog coûte-t-elle cher?

Je peux voir un coup de performance certain sur le simulateur alors qu'il imprime tout cela. Je ne pense pas voir un tel coup sur les appareils, mais je ne suis pas sûr.

Alors est-ce que ça coûte quelque chose de laisser tout le NSLogs dedans? Utilise-t-il plus de mémoire sur l'appareil? Ou est-ce que le compilateur les ignore simplement, comme il fait des commentaires quand je compile pour un périphérique?

EDIT:

Voici ce que je mis en œuvre, par la suggestion de rano.

Dans mon dossier App_Prefix.pch, j'ajouté:

// DLog is almost a drop-in replacement for NSLog 
// DLog(); 
// DLog(@"here"); 
// DLog(@"value: %d", x); 
// Unfortunately this doesn't work DLog(aStringVariable); you have to do this instead  DLog(@"%@", aStringVariable); 
#ifdef DEBUG 
# define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__); 
#else 
# define DLog(...) 
#endif 

// ALog always displays output regardless of the DEBUG setting 
#define ALog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__); 

Et puis dans mon inspecteur Project Info, pour la configuration Debug , sous la rubrique GCC 4.2 - Preprocessing, J'ai ajouté la valeur DEBUG à l'entrée supérieure appelée, Preprocessor Macros.

Fonctionne comme un charme - DLog sorties lorsque je construis une version Debug et ALog sorties toujours.

+0

Voir aussi [Est-il vrai qu'il ne faut pas utiliser NSLog() sur le code de production?] (Http://stackoverflow.com/questions/300673/is-it-true-that-one-should-not-use -nslog-on-production-code) –

Répondre

7

NSLog est sûrement plus pricy qu'un simple printf mais est un peu plus intégré dans le cadre de l'objectif-C et Cocoa. Par ailleurs quand vous êtes sérieusement programmation vous remarquerez qu'il est insuffisant à la plupart de vos besoins. Jetez un oeil à cette article et ses références pour avoir une idée sur la façon de le remplacer d'une manière intelligente.

De cette façon, vous pouvez également avoir le compilateur pour l'ignorer quand il n'est plus utile (par exemple lorsque vous allez libérer votre morceau de code). En général, vous pouvez appeler une fonction log dans le calcul de boucles/séquences intensives de code.

+4

Je voulais juste poster le même lien. Surtout le commentaire 15 par Bill Hollings vaut le coup d'oeil –

+0

@fluchtpunkt ouais ce headr est utile. Même si je préfère un nom plus court pour ma fonction de journalisation, quelque chose comme 'DNSLog' et de cette façon je peux facilement convertir les précédents – rano

0

NSLog n'est pas implémenté comme une macro, donc il y aura certainement un coût. Quantifier et décider si c'est important est plus difficile. Le seul moyen sûr de le faire est de mesurer votre propre application.

0

Les réponses ci-dessus sont périmées. Vous devez simplement utiliser CocoaLumberjack est largement supérieur à NSLog et fournit beaucoup plus de fonctionnalités que les réponses ci-dessus.