
# Kıyaslamalar

Karşılaştırma düzeneği kararlı JSON verileri ve okunabilir bir rapor yazar. [storh deposunda `bench/` içinde bulunur](https://github.com/inline0/storh) 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:

```bash
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ı:

```bash
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:

```text
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.
