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 re
2import time
3
4# Derlenmiş desen
5pattern = re.compile(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b')
6
7# Test verisi: 10000 satır
8text_lines = ['user@example.com test data'] * 10000
9
10# Derlenmiş desen ile arama
11start = time.time()
12for line in text_lines:
13pattern.findall(line)
14compiled_time = time.time() - start
15
16# 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() - start
21
22print(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.0245s
2Derlemesiz: 0.2456s
3Hız artışı: 10.0x

C#'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;
4
5var pattern = new Regex(@"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b", RegexOptions.Compiled);
6
7var sw = Stopwatch.StartNew();
8for (int i = 0; i < 10000; i++)
9{
10pattern.Matches("user@example.com test data");
11}
12sw.Stop();
13
14Console.WriteLine($"Süre: {sw.ElapsedMilliseconds}ms");

Beklenen çıktı:

1Süre: 45ms

Sı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

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz