Μετάβαση στο περιεχόμενο

Συγκριτικές μετρήσεις

Το πλαίσιο συγκριτικής αξιολόγησης γράφει σταθερά JSON και μια αναφορά ευανάγνωστη από τον άνθρωπο. Βρίσκεται στο bench/ στο αποθετήριο storh και δεν περιλαμβάνεται στο πακέτο Composer από το 0.5.2, επομένως οι παρακάτω εντολές composer bench* εκτελούνται μόνο από κλώνο, μετά το composer install:

Κέλυφος
composer bench
composer bench -- --dataset=100000 --engine=doc
composer bench -- --dataset=100000 --engine=log
composer bench -- --dataset=100000 --engine=queue
composer bench -- --dataset=100000 --engine=cache --cache-validation=trust
composer bench -- --dataset=100000 --engine=filter
composer bench -- --dataset=1000000 --engine=uuid
composer bench:jit -- --dataset=1000000 --engine=uuid
composer bench:repeat -- --dataset=100000 --engine=doc --repeat=5
composer bench:repeat -- --dataset=1000000 --engine=filter --repeat=5 --memory-limit=512M
composer bench:range -- --datasets=1000,10000,50000,100000
composer bench:range -- --datasets=100000 --engines=cache --memory-limit=512M
composer bench:compare build/bench-main.json build/bench-current.json
composer bench:gate -- build/bench-main.json build/bench-current.json --threshold=10 --metric=doc.put --metric=log.stream
composer bench:ci

Αποτελέσματα αναφοράς

Διάμεσοι όροι τριών πλήρων εκτελέσεων του πλαισίου, με 50,000 εγγραφές ανά μηχανή, σε Apple M1 Pro (16 GB, macOS 26.5, APFS) με PHP 8.5 CLI, opcache και JIT απενεργοποιημένα:

Κέλυφος
composer bench:repeat -- --dataset=50000 --engine=all --repeat=3 --memory-limit=512M

Κάθε εγγραφή γίνεται flush και fsync πριν το storh αναφέρει ότι αποθηκεύτηκε, επομένως οι ρυθμοί εγγραφής περιορίζονται από το σύστημα αρχείων. Οι αναγνώσεις γίνονται από την προσωρινή μνήμη σελίδων του λειτουργικού συστήματος. Οι ρυθμοί υπολογίζονται από τους διάμεσους όρους· εκτελέστε το composer bench από κλώνο του αποθετηρίου για να μετρήσετε το δικό σας υλικό.

DocStore, 50k εγγραφές διάμεσος
put(), ένα ανθεκτικό αρχείο ανά εγγραφή 3.3k εγγραφές/s
putStream() μαζική εισαγωγή 3.7k εγγραφές/s
importJsonl() 3.6k εγγραφές/s
get() ανάγνωση με STAT 5.6 µs
εκ νέου άνοιγμα υπάρχουσας αποθήκης 0.26 ms
ευρετηριασμένο ερώτημα ισότητας, limit(100) 1.1 ms
ευρετηριασμένη count() σε όλη τη συλλογή 41 µs
δημιουργία ευρετηρίου, 2 πεδία ισότητας + 1 εύρους 52k εγγραφές/s
πλήρης stream() με επανεπικύρωση STAT 103k εγγραφές/s
exportJsonl() 104k εγγραφές/s
SegmentedLog, 50k εγγραφές, τμήματα 16 KB διάμεσος
put(), fsync ανά προσθήκη 16k προσθήκες/s
appendStream() μαζική εισαγωγή 56k εγγραφές/s
ανάγνωση δρομέα, 100 εγγραφές από το μέσο 2.1 ms
ανάγνωση εύρους χρόνου 1.1 ms
count() ισότητας 11 µs
compact() όλα τα κλειστά τμήματα 69k εγγραφές/s
εκ νέου άνοιγμα με ανάκαμψη από ημιτελή ουρά 218k εγγραφές/s

Η συγκριτική αξιολόγηση κλείνει ένα τμήμα κάθε 16 KB για να δοκιμάσει τις εναλλαγές τμημάτων· το προεπιλεγμένο μέγεθος τμήματος είναι 1 MiB.

Queue, 50k εργασίες διάμεσος
enqueue(), fsync ανά συμβάν 22k εργασίες/s
claim() 23k εργασίες/s
complete() 23k εργασίες/s
enqueueMany() 209k εργασίες/s
claimMany() 467k εργασίες/s
completeMany() 512k εργασίες/s
SQL Mirror, SQLite, 50k εγγραφές διάμεσος
αρχική push() 61k γραμμές/s
push() χωρίς καμία αλλαγή 86k εγγραφές/s
flush(), 100 αναγνωριστικά 7.1 ms
ευρετηριασμένη SQL COUNT στο mirror 6.9 ms
rebuild() 65k γραμμές/s
pull() επαναφορά, ένα ανθεκτικό αρχείο ανά εγγραφή 3.2k εγγραφές/s
Micro διάμεσος
αποθηκευμένο στην κρυφή μνήμη get(), ψυχρή και έπειτα θερμή ανάγνωση (MemoryCache, STAT) 83 µs / 6.3 µs
δημιουργία UUIDv7 1.3 µs
επικύρωση UUIDv7 0.30 µs
φιλτράρισμα προβλέψεων στη μνήμη 4.4M γραμμές/s

Στόχοι που καλύπτονται:

  • DocStore put, streaming put, JSONL εξαγωγή/εισαγωγή, get, delete, stream και δημιουργία ευρετηρίου
  • ερωτήματα DocStore με ευρετήριο ισότητας, σύνθετο ευρετήριο, ευρετήριο εύρους, αύξουσα και φθίνουσα ταξινομημένη περιοχή, μέτρηση με ευρετήριο, αναζήτηση ID και χωρίς ευρετήριο
  • SegmentedLog append, streaming append, αναγνώσεις δρομέα, αναγνώσεις εύρους χρόνου, αναγνώσεις συμπυκνωμένου εύρους χρόνου, αναζητήσεις δρομέα και ID του QueryBuilder, μετρήσεις, μετρήσεις μαζικής προσθήκης, στατιστικά, συμπύκνωση
  • Queue enqueue, μαζικό enqueue, claim, μαζικό claim, complete, μαζικό complete, requeue
  • φιλτράρισμα προβλέψεων RecordQuery και QueryCondition σε γραμμές της μνήμης
  • μονοτονική δημιουργία UUIDv7, δημιουργία με διασπορά χρονικών σημάνσεων, επικύρωση και εξαγωγή χρονικών σημάνσεων
  • ανάκαμψη από ημιτελή γραμμή στο τέλος
  • ψυχρές και θερμές αναγνώσεις κρυφής μνήμης με επαλήθευση κατακερματισμού, στατιστικών αρχείου ή εμπιστοσύνης

Προεπιλεγμένη διαδρομή εξόδου:

Text
build/bench-current.json

Οι εκτελέσεις εύρους γράφουν ένα αρχείο JSON για κάθε σύνολο δεδομένων και μηχανή στο build/bench-ranges/.

Το bench:gate συγκρίνει δύο αρχεία JSON συγκριτικής αξιολόγησης και επιστρέφει μη μηδενικό κωδικό εξόδου όταν οποιαδήποτε παρακολουθούμενη μέτρηση είναι πιο αργή από το διαμορφωμένο όριο. Αν δεν δοθούν τιμές --metric, ελέγχονται όλες οι μετρήσεις του αρχείου αναφοράς.

Το bench:ci είναι ο ελαφρύς έλεγχος παλινδρόμησης GitHub Actions. Εκτελεί συγκριτική αξιολόγηση 1k για όλες τις μηχανές, συγκρίνει επιλεγμένες μετρήσεις εγγραφής/ανάγνωσης/κρυφής μνήμης/UUID με την παρακολουθούμενη βάση αναφοράς bench/baselines/ci-1k-all.json και χρησιμοποιεί ένα ευρύ προεπιλεγμένο όριο, ώστε να αποφεύγεται ο συνηθισμένος θόρυβος του εκτελεστή, ενώ εξακολουθούν να εντοπίζονται σοβαρές παλινδρομήσεις επιδόσεων.

Το bench:jit εκτελεί το ίδιο πλαίσιο με ενεργοποιημένα τα CLI opcache και tracing JIT, και απενεργοποιεί το Xdebug για τη διεργασία συγκριτικής αξιολόγησης, ώστε το PHP να μπορεί πράγματι να ενεργοποιήσει το JIT. Το δημιουργημένο JSON περιλαμβάνει σημαίες εκτέλεσης που δείχνουν αν το opcache και το JIT ήταν ενεργά σε εκείνη την εκτέλεση.