1756037722
2025-08-22 13:19:00
プログラマー/開発者との冗談があります。あなたには1つの問題があり、Regexを使用します。2つの問題があります!
それは本当なので面白いです!しかし、冗談はさておき、Regexは非常に強力で役立つことに同意しましょう。しかし、Regexが走るのに費用がかかる可能性があることにも同意しましょう。 regexoptions.compiledで正規表現をキャッシュするように言われます。
しかし、それは十分な練習ですか?それとも「良い」?
今日、私は5年前に作ったバグ修正に困惑しました。バグ修正のコンテキストは時間とともに失われたので、それがどれほどの改善をもたらしたかを見るのは面白いと思います。修正はインスタンスから新しい正規表現を静的にしたので、3つのアプローチを比較するためにテストを書くようにCopilotに依頼しました
- 毎回新しいREGEXを作成します
- regxoptions.compiledを使用して、毎回新しいRegexを作成します
- 一度新しい正規表現を作成し、静的なプロファイルでキャッシュします
Copilotは、このバグを無料のエラーのないコードを作成しました。怖いのは、怠zyを使用することを示唆しています
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
using System.Text.RegularExpressions;
[MemoryDiagnoser] // Enables memory allocation tracking
public class RegexBenchmark
{
private const string Input = "https://example.com/assets/image.png";
private const string Pattern = @"^https://example.com/assets/.*$";
private static readonly Regex StaticRegex = new Regex(Pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase);
[Benchmark]
public bool NewRegex_Interpreted()
{
var regex = new Regex(Pattern, RegexOptions.IgnoreCase);
return regex.IsMatch(Input);
}
[Benchmark]
public bool NewRegex_Compiled()
{
var regex = new Regex(Pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase);
return regex.IsMatch(Input);
}
[Benchmark]
public bool StaticRegex_Compiled()
{
return StaticRegex.IsMatch(Input);
}
}
public class Program
{
public static void Main(string[] args)
{
BenchmarkRunner.Run();
}
}
そして、テスト結果は私にとって驚きでした

StaticRegexが最高であるべきであることは知っていましたが、キャッシュとルックアップでさえ、コンパイルされたregexは大きなマージンで最も遅いだけでなく、割り当ての用語であらゆる高価であることを知って驚きました。特にホットパスの場合は、ノーです!コンパイルされたと思われる経験の浅い開発者にとって、問題は解決しますが、実際には問題が発生します!
自分自身に好意を与え、コードベースで新しいRegexのすべての使用を探してください。まだ静的なプロパティでない場合は、ヒーローになって修正する時間です!別の方法は、コンパイルされたオプションでregex.ismatchを使用することです。そのため、インスタンスを作成しません。静的なRegexインスタンスよりもわずかに遅くなりますが、それほどではなく、誤差の範囲内にある可能性があります。
そして、あなたが余裕を持っている時間があるならば、 .NET正規表現ソースジェネレーター – .NET | Microsoft Learn さらに速いregexの作品のために。
2025年8月22日
#Regexにあなたを遅くさせないでください