Kıyaslamalar
Karşılaştırma düzeneği kararlı JSON verileri ve okunabilir bir rapor yazar. storh deposunda bench/ içinde bulunur ve 0.5.2 tarihinden beri Composer paketinin parçası değildir; bu nedenle aşağıdaki composer bench* komutları yalnızca bir klondan, composer install sonrasında çalıştırılır:
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
Referans sonuçları
Üç tam düzeneğin çalıştırılmasının ortancaları; motor başına 50,000 kayıt, Apple M1 Pro (16 GB, macOS 26.5, APFS) üzerinde, PHP 8.5 CLI ile; opcache ve JIT kapalı:
composer bench:repeat -- --dataset=50000 --engine=all --repeat=3 --memory-limit=512M
Her yazma, storh işleminin kaydedildiğini bildirmesinden önce flush edilip fsync ile diske işlenir; bu nedenle yazma hızları dosya sistemiyle sınırlıdır. Okumalar işletim sisteminin sayfa önbelleğine karşı yapılır. Hızlar ortancalardan hesaplanır; kendi donanımınızda denemek için depoyu klonlayıp composer bench komutunu çalıştırın.
| DocStore, 50k kayıt | ortanca |
|---|---|
put(), kayıt başına bir kalıcı dosya |
3.3k kayıt/s |
putStream() toplu alım |
3.7k kayıt/s |
importJsonl() |
3.6k kayıt/s |
get() nokta okuma, STAT doğrulamalı |
5.6 µs |
| mevcut store'u yeniden açma | 0.26 ms |
dizinli eşitlik sorgusu, limit(100) |
1.1 ms |
koleksiyon genelinde dizinli count() |
41 µs |
| dizin oluşturma, 2 eşitlik + 1 aralık alanı | 52k kayıt/s |
STAT ile yeniden doğrulamalı tam stream() |
103k kayıt/s |
exportJsonl() |
104k kayıt/s |
| SegmentedLog, 50k kayıt, 16 KB bölümler | ortanca |
|---|---|
put(), ekleme başına fsync |
16k ekleme/s |
appendStream() toplu alım |
56k kayıt/s |
| orta noktadan 100 kayıt imleç okuması | 2.1 ms |
| zaman aralığı okuması | 1.1 ms |
eşitlik count() |
11 µs |
tüm mühürlü bölümlerde compact() |
69k kayıt/s |
| yarım kalmış son satır kurtarmasıyla yeniden açma | 218k kayıt/s |
Düzenek, bölüm değişimlerini zorlamak için her 16 KB'de bir bölümü mühürler; varsayılan bölüm boyutu 1 MiB'dir.
| Queue, 50k iş | ortanca |
|---|---|
enqueue(), olay başına fsync |
22k iş/s |
claim() |
23k iş/s |
complete() |
23k iş/s |
enqueueMany() |
209k iş/s |
claimMany() |
467k iş/s |
completeMany() |
512k iş/s |
| SQL Mirror, SQLite, 50k kayıt | ortanca |
|---|---|
ilk push() |
61k satır/s |
hiçbir şey değişmemişken push() |
86k kayıt/s |
flush(), 100 kimlikleri |
7.1 ms |
mirror üzerinde dizinli SQL COUNT |
6.9 ms |
rebuild() |
65k satır/s |
pull() geri yükleme, kayıt başına bir kalıcı dosya |
3.2k kayıt/s |
| Micro | ortanca |
|---|---|
önbelleğe alınmış get(), soğuk ardından sıcak (MemoryCache, STAT) |
83 µs / 6.3 µs |
| UUIDv7 oluşturma | 1.3 µs |
| UUIDv7 doğrulama | 0.30 µs |
| bellekte koşul süzme | 4.4M satır/s |
Kapsanan hedefler:
- DocStore put, akışla put, JSONL dışa/içe aktarma, get, delete, stream ve dizin oluşturma
- eşitlik dizinli, birleşik dizinli, aralık dizinli, artan ve azalan sıralı aralık, dizinli sayım, kimlik araması ve dizin kullanılmayan DocStore sorguları
- SegmentedLog append, akışla append, imleç okumaları, zaman aralığı okumaları, sıkıştırılmış zaman aralığı okumaları, QueryBuilder imleç ve kimlik aramaları, sayımlar, toplu ekleme sayımları, istatistikler, sıkıştırma
- Queue enqueue, toplu enqueue, claim, toplu claim, complete, toplu complete, requeue
- Bellekteki satırlarda RecordQuery ve QueryCondition koşul süzme
- UUIDv7 artan kimlik üretimi, zaman damgası dağılımlı üretim, doğrulama ve zaman damgası çıkarma
- Sondaki yarım kalmış satırların kurtarılması
- Karma, stat veya güvenilir doğrulama ile soğuk ve sıcak önbellek okumaları
Varsayılan çıktı yolu:
build/bench-current.json
Aralık çalıştırmaları, her veri kümesi ve motor için JSON dosyası yazar ve bu dosyaları build/bench-ranges/ altında tutar.
bench:gate, iki karşılaştırma JSON dosyasını karşılaştırır ve izlenen metriklerden herhangi biri yapılandırılmış eşikten daha yavaşsa sıfır olmayan bir kodla çıkar. --metric değeri geçirilmezse temel dosyada bulunan tüm metrikleri denetler.
bench:ci, GitHub Actions performans gerilemesi denetimidir. Tüm motorlarda 1k ölçümlü bir karşılaştırma çalıştırır, seçili yazma/okuma/önbellek/UUID metriklerini izlenen bench/baselines/ci-1k-all.json temeliyle karşılaştırır ve normal çalıştırıcı değişkenliğini tolere ederken büyük performans gerilemelerinde başarısız olacak geniş bir varsayılan eşik kullanır.
bench:jit aynı düzeneği CLI opcache ve izleme JIT etkin olarak çalıştırır ve PHP öğesinin JIT'yi gerçekten etkinleştirebilmesi için karşılaştırma sürecinde Xdebug öğesini devre dışı bırakır. Oluşturulan JSON, bu çalıştırmada opcache ve JIT'nin etkin olup olmadığını gösteren çalışma zamanı bayraklarını içerir.