다음을 통해 공유


정규식의 컴파일 및 다시 사용

정규식 엔진이 식을 컴파일하는 방법과 정규식이 캐시되는 방법을 이해하면 정규식을 광범위하게 사용하는 애플리케이션의 성능을 최적화할 수 있습니다. 이 문서에서는 컴파일, 원본 생성 및 컴파일된 정규식 캐싱에 대해 설명합니다.

해석된 정규식

기본적으로 정규식 엔진은 정규식을 내부 명령 시퀀스(Common Intermediate Language(CIL)와 다른 고급 코드)로 컴파일합니다. 엔진은 정규식을 실행할 때 내부 코드를 해석합니다.

컴파일된 정규식

RegexOptions.Compiled 옵션으로 Regex 개체를 생성하는 경우 정규식이 고급 정규식 내부 명령 대신 명시적 CIL 코드로 컴파일됩니다. 이렇게 하면 .NET의 JIT(Just-In-Time) 컴파일러가 성능 향상을 위해 식을 네이티브 기계어 코드로 변환할 수 있습니다. Regex 개체를 구성하는 비용이 더 높을 수 있지만, 이를 사용하여 일치를 수행하는 비용이 훨씬 더 적을 수 있습니다.

소스 생성 정규식

정규식의 원본 생성은 .NET 7 이상 버전에서 사용할 수 있습니다. 원본 생성기는 IL에서 RegexOptions.Compiled가 내보내는 것과 유사한 논리를 사용하여 사용자 지정 Regex 파생 구현을 C# 코드로 내보냅니다. RegexOptions.Compiled의 처리량 성능 이점과 Regex.CompileToAssembly의 시작 이점을 모두 가져올 수 있지만 CompileToAssembly의 복잡성은 없습니다. 내보내는 원본은 프로젝트의 일부이므로 쉽게 보고 디버그할 수도 있습니다.

가능하다면 RegexOptions.Compiled 옵션을 사용하여 정규식을 컴파일하는 대신 소스에서 생성된 정규식을 사용하세요. 소스 생성 정규식에 대한 자세한 내용은 .NET 정규식 소스 생성기를 참조하세요.

정규식 캐시

성능 향상을 위해 정규식 엔진은 애플리케이션 수준의 컴파일된 정규식 캐시를 유지 관리합니다. 캐시는 정적 메서드 호출에만 사용되는 정규식 패턴을 저장합니다. (인스턴스 메서드에 제공된 정규식 패턴은 캐시되지 않습니다.) 캐싱을 사용하면 사용할 때마다 식을 개략적인 바이트 코드로 다시 분석할 필요가 없습니다.

캐시된 정규식의 최대 개수는 static(Visual Basic의 경우 Shared) Regex.CacheSize 속성 값에 의해 결정됩니다. 기본적으로 정규식 엔진은 최대 15개의 컴파일된 정규식을 캐시합니다. 컴파일된 정규식 개수가 캐시 크기를 초과하면 가장 오래 전에 사용한 정규식이 삭제되고 새 정규식이 캐시됩니다.

애플리케이션은 다음 두 가지 방법 중 하나를 사용하여 정규식을 재사용할 수 있습니다.

  • Regex 개체의 정적 메서드를 사용하여 정규식을 정의합니다. 다른 정적 메서드 호출에서 이미 정의된 정규식 패턴을 사용하는 경우 정규식 엔진이 캐시에서 이를 검색합니다. 캐시에 없으면 엔진이 정규식을 컴파일하고 캐시에 추가합니다.
  • 해당 정규식 패턴이 필요할 때까지 기존 Regex 개체를 다시 사용합니다.

개체 인스턴스화 및 정규식 컴파일의 오버헤드 때문에 수많은 Regex 개체를 만들고 금세 삭제할 경우 큰 비용이 듭니다. 다수의 정규식을 사용하는 애플리케이션의 경우 정적 Regex 메서드 호출을 사용하고 정규식 캐시의 크기를 늘려 성능을 최적화할 수 있습니다.

참고 항목