Ce qui est plus rapide, string.empty() ou de la ficelle.size() == 0?
Récemment, lors d'une discussion que j'ai été invité par un ami programmeur à faire quelques changements dans le code. J'avais quelque chose comme:
if( mystring.size() == 0)
//do something
else
//do something else
La discussion portait sur l'utilisation de mystring.empty()
afin de valider si la chaîne est vide. Maintenant, je suis d'accord qu'il peut être soutenu que string.empty()
est plus détaillé et lisible le code, mais y at-il des avantages de performances?
J'ai fait quelques recherches et ai trouvé ces 2 réponses relatives à ma question:
À la fois les réponses étayer mon affirmation que le string.empty()
est juste plus lisible et n'offre pas tous les avantages de performance, par rapport à string.size() == 0
.
Je veux toujours être sûr que, s'il y a des implémentations de string
que de garder un interne indicateur booléen afin de valider si une chaîne est vide ou pas?
Ou il y a d'autres moyens que certaines implémentations de l'utilisation, susceptibles d'annuler ma demande??
"ma demande que la chaîne.empty() est un peu plus lisible et n'offre pas des avantages de performances" -- juste? la Lisibilité est la première priorité de l'compétente de programmation; la performance, surtout à ce niveau, il est loin derrière. "s'il y a des implémentations de chaîne", même s'il y avait, si ce serait simplement une comparaison entre une valeur à zéro, de même que pour la taille == 0.
Je considère également la lisibilité du code d'une importance capitale, je voulais juste avoir l'avis de gens ici est DONC la implémentations sous-jacentes de vide() ont été plus vite que la taille de l'()??
Je ne vois pas de raison pour un vote. J'ai très bien exprimé la question et c'est une bonne question.
Downvotes ne peut pas être retiré, sauf si la question est édité.
OriginalL'auteur Jatin Ganhotra | 2013-07-09
Vous devez vous connecter pour publier un commentaire.
La norme définit
empty()
comme ceci:Vous auriez du mal à trouver quelque chose qui ne le fait pas, et toute différence de performances serait négligeable en raison de la constante de temps des opérations. Je m'attends à la fois pour compiler à la même assemblée sur une mise en œuvre raisonnable.
Cela dit,
empty()
est claire et explicite. Vous devriez préférer sursize() == 0
(ou!size()
) pour des raisons de lisibilité.Intéressant, je remarque Clang génère presque identique de l'assemblée.
OriginalL'auteur chris
Maintenant, c'est une question assez banale, mais je vais essayer de le couvrir de manière exhaustive donc, quel que soit les arguments sont mis par les collègues ne sont pas susceptibles de vous prendre par surprise....
Comme d'habitude, si le profilage s'est révélé-vous vraiment vraiment avait aux soins, à la mesure: il pourrait être une différence (voir ci-dessous). Mais dans un code général de l'examen de la situation de non-prouvé-problématique-ralentit le code, les questions en suspens sont:
dans certains autres récipients (par exemple C++03 listes, mais pas du C++11),
size()
a été moins efficace queempty()
, conduisant à des codes des conseils de préférerempty()
sursize()
en général, de sorte que si quelqu'un devait basculer le conteneur plus tard (ou de généraliser le traitement dans un modèle où le type de conteneur peut varier), aucun changement ne doit être fait pour maintenir le rendement.ne soit le reflet d'une manière plus naturelle de concevoir le test? - pas exactement ce qu'il vous est arrivé de penser d'abord, ou
size()
parce que vous n'êtes pas aussi utilisé à l'aide deempty()
, mais quand vous êtes concentrés à 100% sur le code environnant logique, nesize()
ouempty()
de mieux s'adapter? Par exemple, peut-être parce que c'est l'un de plusieurs tests desize()
et vous aimez avoir de la cohérence, ou parce que vous êtes à la mise en œuvre d'un célèbre algorithme ou une formule qui est traditionnellement exprimée en termes de taille: être cohérent susceptible de réduire le mental bruit/effort à la vérification de la mise en œuvre à l'encontre de la formule.La plupart du temps, les facteurs ci-dessus sont insignifiants, et de soulever la question dans une revue de code est vraiment une perte de temps.
Différence de performances possibles
Alors que la Norme exige que l'équivalence fonctionnelle, certaines implémentations pourrait les mettre en œuvre de façon différente, mais j'ai lutté et jusqu'à présent échoué à un document particulièrement plausible raison de le faire.
C++11 a plus de contraintes que C++03 sur les comportements des autres fonctions de l'impact de la mise en œuvre des choix:
data()
doit être NUL de résiliation (utilisé pour être justec_str()
),[size()]
est maintenant un index valide et doit retourner une référence à un caractère NUL. Pour divers subtiles raisons, ces restrictions rendent encore plus probable qu'empty()
sera pas plus rapide quesize()
.De toute façon - mesure si vous avez des soins.
empty
départ pour unNUL
au début d'une chaîne de caractères , il ne serait pas juste, carstd::string
permetNUL
personnages, à la différence de C des chaînes de caractères.En C++11, la chaîne de contenu doit être NUL de terminaison. Mais @rici est droit; une mise en œuvre qui a vérifié que le premier char pour NUL serait rompu.
Je pense qu'il ya tout à fait quelques bons points dans ici en dehors de l'université nationale du lesotho question. Je peux facilement voir les
size()
option fonctionne de mieux dans ce contexte et le point sur les exigences de complexité variable par conteneur est également bon.+1 pour mesure si vous vous souciez. Il fonctionne à l'inverse: si l'on veut mesurer, alors qu'il ne s'inquiète pas et la question est nulle (en supposant que la mesure est possible à tous, bien sûr:D).
ironique... arrivé liens suivants pour une autre question sur la chaîne vide, la détection et la juste fini de s'adresser exactement les mêmes questions à propos de NUL sur certains d'autre réponse qu'à trouver, je l'avais oublié moi-même. Des acclamations.
OriginalL'auteur Tony Delroy