Kıyaslamalar
Depoda bin/ ve benchmarks/ altında bir kıyaslama düzeneği bulunur. Bu düzenek her arama modunu gerçek derlemler (WordPress, Laravel) ve oluşturulmuş yapay veri kümeleri üzerinde ölçer, yapılandırılmış raporlar alır ve iki rapor dizisini birbiriyle karşılaştırmanızı sağlar.
Düzenek, Composer paketinin değil deponun bir parçasıdır: 0.2.3, benchmarks/ ve bin/bench* betikleri pakete dahil edilmediğinden, bunları bir klondan (git clone https://github.com/inline0/greph && cd greph && composer install) çalıştırın.
README içinde yayımlanan sayılar yerel makinelerden değil, GitHub Actions çalıştırmalarından alınır. Yerel çalıştırmalar denemeler için kullanışlıdır; doğru değerleri CI çalıştırmaları verir.
Derlemler
Yapay derlemler (synthetic-1k, synthetic-10k, synthetic-100k-single) ilk çalıştırmada benchmarks/corpora/synthetic/ altında oluşturulur. Gerçek derlemler dahil değildir: benchmarks/corpora/wordpress veya benchmarks/corpora/laravel konumuna bir depo kopyası yerleştirin (CI iş akışı, --depth=1 kullanarak WordPress/WordPress deposunu klonlar). Dizini eksik olan derlem atlanır.
Kıyaslamaları çalıştırma
# 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 iki dizi dosyasını (bench-series veya bench-aggregate çıktısını) karşılaştırır ve yoğun kullanılan bir kod yolunda denemeler yaparken faydalı olan bir Markdown özeti yazdırır. bin/bench-ci, gh CLI aracılığıyla GitHub Actions üzerinde Kıyaslama iş akışını başlatır.
Kategoriler
README, her biri motorun belirli bir katmanını ölçen sekiz sonuç grubu yayımlar. Her grupta benchmarks/suites/ içinde tanımlanan bir veya daha fazla düzenek kategorisi yer alır.
Tarama Modu: Metin
Düz metin, regex ve birleşik desenlerde yerel metin araması. Yayımlanan temel ölçüm WordPress derlemi üzerinde çalışır ve şunları içerir:
- Düz metin:
function - Büyük/küçük harfe duyarsız düz metin
- Tam sözcük düz metni
- Yeni örnekle regex
- Dizi çağrısıyla regex
- Önek düz metniyle regex
- Sonek düz metniyle regex
- Tam satır düz metniyle regex
- Düz metin daraltmalı regex
Tarama Modu: Gezinme
Arama yapmadan yalnızca dosyaları gezme. gitignore uyumlu gezginin kendi maliyetini ölçer.
Tarama Modu: Paralel Metin
function için 1, 2 ve 4 işli sabit dize araması. Bu desen için işçi havuzu yalnızca jobs * 4_000 dosyayı aşınca başlar (bkz. Paralel İşçiler); WordPress derleminde bu sayıdan az dosya olduğundan, yayımlanan üç satırın tümü tek süreçte çalışır ve havuzun ölçeklenmesini göstermez (#8).
Tarama Modu: AST
Temsili desenlerde yerel AST araması:
new $CLASS()array($$$ITEMS)
Dizinli Metin Modu
Tarama modundaki desenlerle aynı desenleri kullanan, ısıtılmış dizinli metin araması. Düz metin, büyük/küçük harfe duyarsız, tam sözcük, kısa belirteç ve regex sorgularını içerir.
Dizinli Özet Sorguları
Eşleşme sayısı, eşleşme içeren dosyalar ve eşleşme içermeyen dosyalar çıktıları kullanan ısıtılmış dizinli metin araması. Dosya başına yapılan işlem en ucuz olduğundan, bunlar en çok gönderim deposundan yararlanır.
Dizinli / Önbelleğe Alınmış AST
AST tarama modundaki desenlerle aynı desenleri kullanan, ısıtılmış AST olgusu araması ve önbelleğe alınmış AST araması.
Derleme Maliyetleri
Trigram dizininin, AST olgu dizininin ve AST önbelleğinin soğuk derleme maliyetleri. Belirli bir iş yükü için hangi modu sürdüreceğinize karar verirken kullanışlıdır.
Yayımlanan sayıları okuma
README, her temel ölçüm için en güncel CI çalıştırmasının anlık görüntüsünü yayımlar. Her bölüm belirli bir GitHub Actions çalıştırmasından alınır; derlem, çalıştırıcı, PHP sürümü, ölçülen çalıştırma ve ısınma sayılarıyla etiketlenir. Bir sayıyı yeniden üretmeniz gerekirse yerel olarak aynı bileşimi kullanın.
Karşılaştırma sütunları (rg, grep, sg) aynı işte, aynı çalıştırıcıda ve aynı derlem üzerinde toplanır. Harici kıyaslamalardan tahmin edilmez.
Kıyaslama ekleme
benchmarks/altında bir kıyaslama tanımı ekleyin.- Henüz eşdeğeri yoksa gerileme test paketine karşılık gelen bir senaryo ekleyin (ölçülen davranışın da doğrulanması için).
- Yeni kıyaslamayı doğrulamak için
./bin/bench --category <yours>çalıştırın. src/,benchmarks/veyabin/dosyalarına dokunan çekme isteklerinde çalışan Kıyaslama iş akışıylamainkarşılaştırın ve çalıştırma özetinde son değişiklik ile temel sürümün karşılaştırmasını yayımlayın.- Yeni kıyaslamayı içeren CI çalıştırması
mainüzerinde tamamlandığında README tablosunu güncelleyin.
Performans yaklaşımı
Greph, soğuk taramalarda ripgrep veya grep'ten daha hızlı olmayı hedeflemiyor. Ripgrep, elle ayarlanmış SIMD düz metin taramasıyla Rust içinde uygulanır ve yayımlanan sayılara göre her soğuk metin taramasında hem rg hem de GNU grep, Greph'den daha hızlıdır. Hedefler farklıdır:
- Etkileşimli kullanımın ve ajan döngülerinin yerelmiş gibi hissettirmesi için yeterince hızlı olmak.
- Isıtılmış dizinlerde tekrarlanan sorguları yanıtlamak: dizinli regex, dizinli sayım ve dosya listesi sorguları, aynı ağacı tarayan hem
rghem degrepişleminden daha hızlıdır. - Dizinli ve önbelleğe alınmış AST iş yüklerinde
ast-grep'yi geçmek; bu iş yüklerinde Greph'ün ısıtılmış önbellekleri ağacı yeniden ayrıştırmayı önler. Soğuk AST araması değişken sonuç verir:new $CLASS(),sg'ten hızlıdır;array($$$ITEMS)ise yavaştır. - Her performans iyileştirmesini ölçülebilir ve tekrarlanabilir kılmak.
Bir kıyaslama raporuyla desteklenmeyen performans iddiaları kabul edilmez.