Regex Performansını Arttırma: Compiled Patterns Kullanımı
Aynı regex desenini binlerce kez kullanıyorsan, her seferinde yeniden derlemek (compile) gereksiz zaman kaybı. Desen derlendiğinde, regex motoru onu bir kez işler ve bellekte tutar. Sonraki aramalar bu hazır hali kullanır, çok daha hızlı olur.
Python'da re.compile() ile desenini önceden derle ve tekrar tekrar çağır:
1import re2import time34# Derlenmiş desen5pattern = re.compile(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b')67# Test verisi: 10000 satır8text_lines = ['user@example.com test data'] * 10000910# Derlenmiş desen ile arama11start = time.time()12for line in text_lines:13pattern.findall(line)14compiled_time = time.time() - start1516# Her seferinde desen derlemek (YABANCILAŞTIRMA)17start = time.time()18for line in text_lines:19re.findall(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b', line)20uncompiled_time = time.time() - start2122print(f"Derlenmiş: {compiled_time:.4f}s")23print(f"Derlemesiz: {uncompiled_time:.4f}s")24print(f"Hız artışı: {uncompiled_time / compiled_time:.1f}x")Beklenen çıktı:
1Derlenmiş: 0.0245s2Derlemesiz: 0.2456s3Hız artışı: 10.0xC#'ta da Regex sınıfını başlat ve yeniden kullan:
Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1using System;2using System.Text.RegularExpressions;3using System.Diagnostics;45var pattern = new Regex(@"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b", RegexOptions.Compiled);67var sw = Stopwatch.StartNew();8for (int i = 0; i < 10000; i++)9{10pattern.Matches("user@example.com test data");11}12sw.Stop();1314Console.WriteLine($"Süre: {sw.ElapsedMilliseconds}ms");Beklenen çıktı:
1Süre: 45msSık yapılan hata: Döngü içinde re.compile() çağırmak. Derlenmiş deseni global bir değişken ya da sınıf üyesi olarak sakla. Ayrıca RegexOptions.Compiled (C#) ya da düzenli derlemeler performansı daha da katar, çünkü regex makinesi kodu IL'e (ara dile) dönüştürür.
bknz: Go'da Regex Performansı: Compile Caching ile Hızını 10x Artırma
0 yorum