Je travaille sur un problème de performances sur JavaScript. Donc, je veux juste demander: quel est le moyen le plus rapide de vérifier si une chaîne contient une autre sous-chaîne (j'ai juste besoin de la valeur booléenne)? Pouvez-vous suggérer votre idée et un exemple de code d'extrait?
javascript
regex
substring
Đinh Hồng Châu
la source
la source
regex
balise)?Réponses:
Vous avez deux possibilités:
Expression régulière :
indexOf
:Les expressions régulières semblent être plus rapides (du moins dans Chrome 10).Test de performance - Botte de foin courte
Test de performance - Botte de foin longue
Mise à jour 2011:
On ne peut pas dire avec certitude quelle méthode est la plus rapide. Les différences entre les navigateurs sont énormes. Alors que dans Chrome 10
indexOf
semble être plus rapide, dans Safari 5,indexOf
c'est clairement plus lent que toute autre méthode.Vous devez voir et essayer par vous-même. Cela dépend de vos besoins. Par exemple, une recherche insensible à la casse est beaucoup plus rapide avec les expressions régulières.
Mise à jour 2018:
Juste pour éviter aux gens d'exécuter eux-mêmes les tests, voici les résultats actuels pour la plupart des navigateurs courants, les pourcentages indiquent une augmentation des performances par rapport au résultat suivant le plus rapide (qui varie d'un navigateur à l'autre):
Chrome: indexOf (~ 98% plus rapide)
<-- wow
Firefox: RegExp mis en cache (~ 18% plus rapide)
IE11: RegExp mis en cache (~ 10% plus rapide)
Edge: indexOf (~ 18% plus rapide)
Safari: RegExp mis en cache (~ 0.4% plus rapide)
Notez que RegExp mis en cache est:
var r = new RegExp('simple'); var c = r.test(str);
par opposition à:/simple/.test(str)
la source
indexOf
ne fonctionne pas. Je ne sais pas pourquoi. L'utilisation de Regex le fait cependant. Il s'agit d'un cas limite, mais d'autres pourraient rencontrer le même problème.Est-ce que ça marche pour toi?
Edit: Cela peut ne pas être plus rapide qu'un RegExp si la chaîne2 contient des modèles répétés. Sur certains navigateurs, indexOf peut être beaucoup plus lent que RegExp. Voir les commentaires.
Edit 2: RegExp peut être plus rapide que indexOf lorsque les chaînes sont très longues et / ou contiennent des motifs répétés. Voir les commentaires et la réponse de @ Felix.
la source
test
.indexOf
est une magnitude plus lente que toute autre méthode. On ne peut donc pas dire quelle méthode est la plus rapide. Cela varie d'un navigateur à l'autre.Le plus rapide
http://jsben.ch/9cwLJ
la source
Dans ES6, la
includes()
méthode est utilisée pour déterminer si une chaîne peut être trouvée dans une autre chaîne, retournéetrue
oufalse
selon le cas.Voici jsperf entre
Et
Comme le résultat montré dans jsperf, il semble que les deux fonctionnent bien.
la source
str.includes("x|y")
:; recherchez les littéraux «x» ou «y» dans le même appel.regex
. Un travail autour de votre question,str.includes("x") || str.includes('y')
indexOf
est nettement plus rapide queincludes
(jusqu'à 1600% plus rapide). On ne sait pas comment une différence de 44 millions d'itérations / s et de 777 millions d'itérations / s et plus de 777 millions d' i / s affecte les performances dans le monde réel, mais le mobile en profite suffisamment, ce quiindexOf
devrait être le choix idéal.J'ai trouvé que l'utilisation d'une simple boucle for, l'itération sur tous les éléments de la chaîne et la comparaison en utilisant sont
charAt
plus rapides queindexOf
ouRegex
. Le code et la preuve sont disponibles sur JSPerf .ETA:
indexOf
et lescharAt
deux fonctionnent de manière similaire sur Chrome Mobile selon les données de portée du navigateur répertoriées sur jsperf.comla source
Pour trouver une chaîne simple, utiliser la méthode indexOf () et utiliser regex est à peu près la même chose: http://jsperf.com/substring - choisissez donc celui qui semble le plus facile à écrire.
la source
J'ai fait un jsben.ch pour vous http://jsben.ch/#/aWxtF ... il semble que indexOf est un peu plus rapide.
la source
C'est un moyen facile d'utiliser la
.match()
méthode pour enchaîner.Je vous souhaite une bonne journée, monsieur!
la source
match
quand il y a unetest
méthode… Découvrez la réponse principale.