Συγκριτικές μετρήσεις
Το αποθετήριο περιλαμβάνει πλαίσιο συγκριτικών μετρήσεων στα bin/ και benchmarks/. Μετρά κάθε λειτουργία αναζήτησης σε πραγματικά σώματα δεδομένων (WordPress, Laravel) και συνθετικά σύνολα δεδομένων που δημιουργούνται αυτόματα, καταγράφει δομημένες αναφορές και επιτρέπει τη σύγκριση δύο σειρών αναφορών.
Το πλαίσιο είναι μέρος του αποθετηρίου, όχι του πακέτου Composer: επειδή τα 0.2.3, benchmarks/ και τα σκριπτ bin/bench* εξαιρούνται από το πακέτο, εκτελέστε τα από ένα κλωνοποιημένο αποθετήριο (git clone https://github.com/inline0/greph && cd greph && composer install).
Οι δημοσιευμένοι αριθμοί στην README προέρχονται από εκτελέσεις του GitHub Actions, ποτέ από τοπικά μηχανήματα. Οι τοπικές εκτελέσεις είναι χρήσιμες για δοκιμές· οι εκτελέσεις του CI είναι η έγκυρη πηγή.
Σώματα δεδομένων
Τα συνθετικά σώματα δεδομένων (synthetic-1k, synthetic-10k, synthetic-100k-single) δημιουργούνται στο benchmarks/corpora/synthetic/ κατά την πρώτη εκτέλεση. Τα πραγματικά σώματα δεδομένων δεν περιλαμβάνονται: τοποθετήστε ένα αντίγραφο του αποθετηρίου στο benchmarks/corpora/wordpress ή στο benchmarks/corpora/laravel (η ροή εργασιών του CI κλωνοποιεί το WordPress/WordPress με το --depth=1). Αν λείπει ο κατάλογος ενός σώματος δεδομένων, αυτό παραλείπεται.
Εκτέλεση συγκριτικών μετρήσεων
# Full benchmark suite, every corpus that is present
./bin/bench
# Specific category (the category names used in benchmarks/suites/)
./bin/bench --category text
./bin/bench --category ast
# Compare against external tools when available
./bin/bench --compare rg,grep
./bin/bench --compare sg
# Choose a corpus
./bin/bench --corpus wordpress
./bin/bench --corpus laravel
./bin/bench --corpus synthetic-1k
# Write the run as JSON
./bin/bench --corpus wordpress --output build/run-1.json
# Measured series: 5 runs after 1 warmup run
./bin/bench-series --repeat 5 --warmup 1 --corpus wordpress --output build/head-series.json
# Aggregate separate runs into one series
./bin/bench-aggregate --output build/head-series.json build/run-*.json
Το bin/bench-compare base-series.json head-series.json συγκρίνει δύο αρχεία σειρών (την έξοδο των bench-series ή bench-aggregate) και εμφανίζει μια σύνοψη Markdown, χρήσιμη κατά τη βελτιστοποίηση μιας κρίσιμης διαδρομής. Το bin/bench-ci ενεργοποιεί τη ροή εργασιών Benchmark στο GitHub Actions μέσω του gh CLI.
Κατηγορίες
Το README δημοσιεύει οκτώ ομάδες αποτελεσμάτων, καθεμία από τις οποίες μετρά ένα συγκεκριμένο επίπεδο της μηχανής. Κάθε ομάδα συγκεντρώνει μία ή περισσότερες κατηγορίες του πλαισίου που ορίζονται στο benchmarks/suites/.
Λειτουργία σάρωσης: κείμενο
Εγγενής αναζήτηση κειμένου για κυριολεκτικά, κανονικές εκφράσεις και συνδυασμένα μοτίβα. Η δημοσιευμένη βασική μέτρηση εκτελείται στο σώμα δεδομένων WordPress και περιλαμβάνει:
- Κυριολεκτικό
function - Κυριολεκτικό, χωρίς διάκριση πεζών-κεφαλαίων
- Κυριολεκτικό, ολόκληρη λέξη
- Νέα παρουσία κανονικής έκφρασης
- Κλήση πίνακα κανονικών εκφράσεων
- Κυριολεκτικό πρόθεμα κανονικής έκφρασης
- Κυριολεκτικό επίθημα κανονικής έκφρασης
- Κυριολεκτική ακριβής γραμμή κανονικής έκφρασης
- Συγχώνευση κυριολεκτικών κανονικών εκφράσεων
Λειτουργία σάρωσης: διάσχιση
Μόνο περιήγηση αρχείων, χωρίς αναζήτηση. Μετρά το κόστος του περιηγητή που λαμβάνει υπόψη το gitignore.
Λειτουργία σάρωσης: παράλληλο κείμενο
Αναζήτηση σταθερής συμβολοσειράς για το function με 1, 2 και 4 εργασίες. Για αυτό το μοτίβο, η ομάδα εργαζομένων ξεκινά μόνο πάνω από jobs * 4_000 αρχεία (βλ. Παράλληλοι εργαζόμενοι), περισσότερα από όσα περιέχει το σώμα δεδομένων WordPress, επομένως και οι τρεις δημοσιευμένες σειρές εκτελούνται σε μία διεργασία και δεν δείχνουν κλιμάκωση της ομάδας (#8).
Λειτουργία σάρωσης: AST
Εγγενής αναζήτηση AST με αντιπροσωπευτικά μοτίβα:
new $CLASS()array($$$ITEMS)
Λειτουργία κειμένου με ευρετήριο
Αναζήτηση κειμένου με ενεργό ευρετήριο, με τα ίδια μοτίβα όπως στη λειτουργία σάρωσης. Περιλαμβάνει ερωτήματα κυριολεκτικού κειμένου, χωρίς διάκριση πεζών-κεφαλαίων, ολόκληρης λέξης, σύντομων διακριτικών και κανονικών εκφράσεων.
Συνοπτικά ερωτήματα με ευρετήριο
Αναζήτηση κειμένου με ενεργό ευρετήριο και έξοδο καταμέτρησης, αρχείων με αντιστοιχίες και αρχείων χωρίς αντιστοιχίες. Αυτά ωφελούνται περισσότερο από το αποθετήριο postings, επειδή η εργασία ανά αρχείο είναι η λιγότερο απαιτητική.
AST με ευρετήριο / αποθηκευμένο στην προσωρινή μνήμη
Αναζήτηση γεγονότων AST με ενεργό ευρετήριο και αναζήτηση AST από την προσωρινή μνήμη, με τα ίδια μοτίβα όπως στη λειτουργία σάρωσης AST.
Κόστος δημιουργίας
Κόστος ψυχρής δημιουργίας για το ευρετήριο trigram, το ευρετήριο γεγονότων AST και την προσωρινή μνήμη AST. Χρήσιμο για να αποφασίσετε ποια λειτουργία να διατηρείτε για έναν συγκεκριμένο φόρτο εργασίας.
Ανάγνωση των δημοσιευμένων αριθμών
Το README δημοσιεύει ένα στιγμιότυπο της πιο πρόσφατης εκτέλεσης CI για κάθε βασική μέτρηση. Κάθε ενότητα προέρχεται από συγκεκριμένη εκτέλεση GitHub Actions και επισημαίνεται με το σώμα δεδομένων, το σύστημα εκτέλεσης, την έκδοση PHP και τον αριθμό μετρημένων εκτελέσεων και προθερμάνσεων. Για να αναπαράγετε έναν αριθμό, χρησιμοποιήστε τον ίδιο συνδυασμό τοπικά.
Οι στήλες σύγκρισης (rg, grep, sg) συγκεντρώνονται στην ίδια εργασία, στο ίδιο σύστημα εκτέλεσης και στο ίδιο σώμα δεδομένων. Δεν αποτελούν προβολές από εξωτερικές συγκριτικές μετρήσεις.
Προσθήκη συγκριτικής μέτρησης
- Προσθέστε έναν ορισμό μέτρησης στο
benchmarks/. - Προσθέστε το αντίστοιχο σενάριο στη σουίτα παλινδρόμησης, αν δεν υπάρχει ήδη ισοδύναμο (ώστε να επαληθεύεται και η συμπεριφορά που μετράται).
- Εκτελέστε το
./bin/bench --category <yours>για να επικυρώσετε τη νέα μέτρηση. - Συγκρίνετε με το
mainμέσω της ροής εργασιών Benchmark, η οποία εκτελείται σε αιτήματα συγχώνευσης που αφορούν ταsrc/,benchmarks/ήbin/και δημοσιεύει σύγκριση της τρέχουσας έκδοσης με τη βασική έκδοση στη σύνοψη της εκτέλεσης. - Ενημερώστε τον πίνακα README μόλις η εκτέλεση CI που περιλαμβάνει τη νέα μέτρηση ενσωματωθεί στο
main.
Φιλοσοφία απόδοσης
Το Greph δεν προσπαθεί να ξεπεράσει το ripgrep ή το grep σε ψυχρές σαρώσεις. Το Ripgrep υλοποιείται στο Rust με χειροκίνητα βελτιστοποιημένη σάρωση κυριολεκτικών συμβολοσειρών SIMD, και στις δημοσιευμένες μετρήσεις τόσο το rg όσο και το GNU grep είναι ταχύτερα από το Greph σε κάθε ψυχρή σάρωση κειμένου. Οι στόχοι διαφέρουν:
- Να είναι αρκετά γρήγορο ώστε η διαδραστική χρήση και οι κύκλοι λειτουργίας των agent να μοιάζουν εγγενείς.
- Να απαντά σε επαναλαμβανόμενα ερωτήματα από προθερμασμένα ευρετήρια: τα ερωτήματα κανονικών εκφράσεων και καταμέτρησης με ευρετήριο, καθώς και τα ερωτήματα λίστας αρχείων, είναι ταχύτερα από τις σαρώσεις των
rgκαιgrepστο ίδιο δέντρο. - Να ξεπερνά το
ast-grepσε φόρτους εργασίας AST με ευρετήριο και από την προσωρινή μνήμη, όπου οι προθερμασμένες μνήμες του Greph αποφεύγουν την εκ νέου ανάλυση του δέντρου. Η ψυχρή αναζήτηση AST έχει μικτά αποτελέσματα: τοnew $CLASS()είναι ταχύτερο από τοsg, ενώ τοarray($$$ITEMS)είναι πιο αργό. - Να καθιστά κάθε βελτίωση απόδοσης μετρήσιμη και αναπαραγώγιμη.
Δεν ενσωματώνονται ισχυρισμοί για την απόδοση χωρίς υποστήριξη από αναφορά συγκριτικών μετρήσεων.