- Un outil de recherche de chaînes ultra-rapide, écrit en C, pour les applications où les performances sont cruciales
- Sélection dynamique de l’algorithme optimal selon les caractéristiques du motif et le matériel
- Exploite le matériel comme SSE4.2/AVX2 pour offrir un débit maximal
- Découpe les fichiers en chunks pour un traitement parallèle multithread afin de gérer de très gros volumes
- Utilise l’algorithme de recherche le plus adapté selon le motif
- Boyer-Moore-Horspool : adapté à la recherche de motifs générale
- Algorithme Knuth-Morris-Pratt (KMP) : optimisé pour les motifs courts
- Rabin-Karp : efficace pour les motifs longs
- Accélération SIMD : amélioration des performances sur le matériel compatible SSE4.2 et AVX2
- Utilise les fichiers mappés en mémoire pour les E/S afin de minimiser les appels système et maximiser le débit
- Options de recherche flexibles
- Recherche sensible et insensible à la casse
- Possibilité de rechercher directement dans une chaîne, en plus des fichiers
- Mode permettant d’afficher uniquement le nombre de correspondances
Utilisation
krep [OPTIONS] PATTERN [FILE]
- Rechercher « error » dans un fichier journal :
krep "error" system.log
- Rechercher sans tenir compte de la casse avec 8 threads :
krep -i -t 8 "ERROR" large_logfile.log
- Afficher le nombre de correspondances (sans afficher les lignes correspondantes) :
krep -c "TODO" *.c
- Rechercher directement dans une chaîne au lieu d’un fichier :
krep -s "Hello" "Hello world"
Options en ligne de commande
- -i : recherche insensible à la casse
- -c : affiche uniquement le nombre de correspondances sans afficher les lignes correspondantes
- -t NUM : utilise NUM threads (valeur par défaut : 4)
- -s STRING : recherche dans une chaîne plutôt que dans un fichier
- -v : affiche les informations de version
- -h : affiche l’aide
Benchmarks
- Les performances de
krep sont excellentes par rapport aux outils classiques de recherche de chaînes.
- krep a mis 0,78 seconde pour rechercher un motif courant dans un fichier texte de 1 Go, soit un débit de 1 282 Mo/s
- grep a mis 2,95 secondes pour la même tâche, avec un débit de 339 Mo/s
- ripgrep a mis 1,48 seconde, avec un débit de 676 Mo/s
- →
krep est environ 3,8 fois plus rapide que grep, et environ 1,9 fois plus rapide que ripgrep (les performances peuvent varier selon le matériel et les caractéristiques du fichier)
Origine du nom
- « krep » vient de l’islandais « kreppan »
- Le mot signifie « saisir rapidement »
- Il symbolise une reconnaissance efficace des motifs
- C’est une commande courte et concise, facile à taper
2 commentaires
Abandonner la prise en charge des expressions régulières pour n’être que deux fois plus rapide que ripgrep, ça réduit quand même pas mal son intérêt.
Moi, je pense que je vais simplement continuer à utiliser ripgrep, qui gère les expressions régulières.
Avis sur Hacker News
Les fonctionnalités CPU (par ex. AVX2) doivent être détectées à l’exécution
ifdefne détecte qu’à la compilation si le compilateur les prend en chargePrésentation d’un billet de blog sur le projet krep
madvise()se produit, il faut ajouter-D_GNU_SOURCEauxCFLAGSduMakefileImportance des cas de test
Résultats des benchmarks après résolution du problème de build
Tentative de benchmark avec une fréquence élevée de correspondances
Tentatives de benchmark supplémentaires
Algorithme de ripgrep et usage du memory mapping
Doutes sur les résultats des benchmarks
Avis sur le nom de krep