2016-07-09 4 views
0

Combien de fois l'opérateur typeof est-il plus rapide qu'un appel de fonction? Ou est-ce négligeable et micro-optimisant?Utilisation d'une fonction ou d'un type

if (isNumber(myVar)) { 
} 

if (typeof myVar === 'number') { 
} 
+5

Testez-le et découvrez-le? – David

+1

Je ne ferais pas autant de contrôles de type en premier lieu. – ftor

+2

Voyant que 'isNumber' est' undefined' et ne ferait que lancer une erreur, cela devrait être beaucoup plus rapide que la vérification de la chaîne – adeneo

Répondre

4

Ou est-il négligeable et micro-optimisation?

Oui, cela est certainement quelque chose à vous soucier de si et seulement si vous identifiez le code en question comme un goulot d'étranglement de performance, ce qui est vraiment peu probable. C'est la micro-optimisation. Les appels de fonction sont vraiment, vraiment rapide même s'ils ne sont pas optimisés par le moteur JavaScript. J'avais l'habitude de m'inquiéter de la surcharge de l'appel de fonction quand Array#forEach est apparu sur la scène. Même à l'époque, ce n'était pas un problème, même sur l'interpréteur JavaScript le plus ancien et le plus lent que j'ai pu trouver: celui de IE6. Détails sur mon blog: foreach and runtime cost

Re si cela prend plus de temps ... Quelle est la longueur d'un morceau de ficelle? Cela dépend totalement du moteur JavaScript que vous utilisez et du fait que le code en question est identifié comme un point "chaud" par le moteur (en supposant que c'est un moteur comme le V8 qui fonctionne par étapes et optimise les points chauds).

Un moteur moderne est susceptible d'être intégré s'il devient important de le faire. Ce n'est pas une garantie.

+0

Dans un cas minime comme celui-ci, vous pouvez pratiquement garantir qu'il sera inséré dans quelques dizaines d'appels dans n'importe quel moteur moderne capable de fonctionner, sauf si vous utilisez un script super trivial qui ne l'utilise que quelques fois . –

+0

@IsiahMeadows: Citation? Je doute beaucoup que cela prendrait seulement quelques douzaines d'appels (pas que ça compte vraiment). Rappelez-vous le bug du vilebrequin V8 avec 'typeof null'? En règle générale, des centaines, voire des milliers d'appels ont été lancés avant que le V8 ne lance le vilebrequin pour l'optimiser et que le bug se manifeste. –

+0

D'accord ... Je ne me souviens probablement pas du seuil exact (et vous avez raison de dire que je suis un peu déconnecté), mais il s'incruste généralement si le code se trouve sur un chemin chaud. –

3

Ou est-il négligeable et micro-optimisation?

C'est négligeable et micro-optimisation.


Si vous voulez vérifier si quelque chose est un numéro, je recommande d'utiliser un chèque isNaN puis coulée à un certain nombre.

if (!isNaN(myVar)) { 
    myVar = +myVar; 
} 

De cette façon, vous ne vous souciez pas réellement de la façon dont la valeur est traitée comme un nombre.

Quelqu'un utilisant l'API pourrait alors choisir de passer un objet qui peut être traité comme un numéro:

myVar = { 
    valueOf: function() { 
    return 5; 
    } 
}; 
+0

ne vous embêtez pas à vérifier si 'myVar' est réellementNON, il suffit de le lancer! Il est tellement rapide, que peu importe que vous le fassiez à un nombre réel. Et il nettoie votre code, ce qui est beaucoup plus important. Habituellement, vous devez vous soucier beaucoup plus des vraies valeurs NaN dans vos calculs, donc mon code ressemble généralement à myVar = + myVar || 0; ' – Thomas

+0

@Thomas Si vous voulez éviter toutes les conversions automatiques incorrectes de valeurs falsifiées, voir [la réponse du CMS] (http://stackoverflow.com/a/1830844/1169519). – Teemu

+1

@Thomas Non, il est plus important que le code soit correct. Plusieurs types de données peuvent être associés à un nombre, mais cela ne signifie pas qu'il s'agit d'un nombre. Par exemple, une chaîne n'est pas un nombre. –