Je suis vraiment étonné par la fonctionnalité de GREP dans le shell, auparavant, j'utilisais la méthode de sous-chaîne en java mais maintenant j'utilise GREP pour cela et il s'exécute en quelques secondes, il est incroyablement plus rapide que le code java que j'avais l'habitude d'écrire. (d'après mon expérience, je me trompe peut-être)
Cela étant dit, je n'ai pas été en mesure de comprendre comment cela se passe? il n'y a pas non plus beaucoup de disponible sur le Web.
Est-ce que quelqu'un peut m'aider avec ça?
Réponses:
En supposant que votre question concerne
GNU grep
spécifiquement. Voici une note de l'auteur, Mike Haertel:Cette réponse est un sous-ensemble des informations tirées d' ici .
la source
Pour ajouter à l'excellente réponse de Steve.
Cela n'est peut-être pas très connu, mais grep est presque toujours plus rapide lorsqu'il recherche une chaîne de motif plus longue qu'une chaîne courte, car dans un motif plus long, Boyer-Moore peut avancer dans des foulées plus longues pour atteindre des vitesses sublinéaires encore meilleures :
Exemple:
La forme la plus longue est 35% plus rapide!
Comment venir? Boyer-Moore consolide une table de saut en avant à partir de la chaîne de modèle, et chaque fois qu'il y a une discordance, il choisit le saut le plus long possible (du dernier caractère au premier) avant de comparer un seul caractère de l'entrée au caractère de la table de saut.
Voici une vidéo expliquant Boyer Moore (crédit à kommradHomer)
Une autre idée fausse courante (pour GNU grep) est que
fgrep
c'est plus rapide quegrep
.f
infgrep
ne signifie pas `` rapide '', cela signifie `` fixe '' (voir la page de manuel), et comme les deux sont le même programme, et les deux utilisent Boyer-Moore , il n'y a pas de différence de vitesse entre eux lors de la recherche de fixed- chaînes sans caractères spéciaux de regexp. L'utilisation seule raison Ifgrep
est quand il y a un caractère spécial regexp (comme.
,[]
ou*
) Je ne veux pas qu'il soit interprété comme tel. Et même dans ce cas, la forme la plus portable / standardgrep -F
est préféréefgrep
.la source
xs.txt
contienne 100000000 'x, et vous le faitesgrep yx xs.txt
, alors il ne parvient pas à trouver une correspondance plus tôt que si vous le faitesgrep yxxxxxxxxxxxxxxxxxxx xs.txt
. L'amélioration de Boyer-Moore-Horspool à Boyer-Moore améliore le saut dans ce cas, mais ce ne sera probablement pas seulement trois instructions de la machine dans le cas général.grep/fgrep/egrep
était tous des liens physiques vers le même exécutable soit révolue. Ils (et d'autres extensions comme lesz*grep
bz*grep
utils qui se décompressent à la volée), sont maintenant de petits enveloppeurs de shellgrep
. Quelques commentaires historiques intéressants sur le basculement entre un exécutable unique et des wrappers shell peuvent être trouvés dans ce commit: git.savannah.gnu.org/cgit/grep.git/commit/…