2012-10-18 3 views
11

Regex.CacheSize 속성 컴파일 된 정규식의 현재 정적 캐시에있는 최대 항목 수를 가져 오거나 설정합니다.캐시 된 정규식의 수를 확인할 수 있습니까?

Regex 클래스는 정적 메서드 호출에 사용되는 컴파일 된 정규 표현식의 내부 캐시를 유지 관리합니다. 집합 연산에 지정된 값이 현재 캐시 크기보다 작 으면 캐시 크기가 지정된 값과 같아 질 때까지 캐시 항목이 삭제됩니다.

기본적으로 캐시에는 15 개의 컴파일 된 정적 정규 표현식이 저장됩니다. 응용 프로그램>은 일반적으로 캐시 크기를 수정할 필요가 없습니다. 캐싱을 끄거나 비정상적으로 큰 캐시가있는 경우에만 CacheSize 속성을 사용하십시오.

그래서 캐시의 현재 표현식에 대해 자세히 알고 싶습니다. 누구나 가능하다는 것을 알 수 있습니까?

아이디어가 내가 지금 < 15 개를 재사용한다는 것이므로 CacheSize과 피들링하고 싶지는 않지만 실제 캐시 사용량을 어느 시점에서 확인할 수 있기를 바란다. 정규식 사용이 확장됨에 따라) CacheSize을 동적으로 조정하십시오.

또는 단순히 CacheSize을 임의로 큰 숫자로 늘리는 오버 헤드에 대한 의견은 무엇입니까?

+0

AFAIK 노출 방법은 없지만 반사를 사용하여 값을 가져올 수는 있습니다. 나는 캐시를'LinkedListNode livecode'라고 믿는다. – Lloyd

+0

왜 컴파일 된 Regex 인스턴스를 만들고 캐시의 블랙 박스 접근 방식이 아닌 직접 관리해야합니까? 예기치 않은 방향으로 코드베이스가 커지거나 라이브러리로 사용된다면 최대 캐시 크기 값은 적합하지 않습니다. – spender

답변

14

디 컴파일 (mscorlib 4.0)은 캐시가 internal 링크 된 목록 CachedCodeEntry임을 보여줍니다. 따라서 리플렉션없이 캐시에 도달하지 않을 것입니다. 최대 캐시 크기를 증가

오버 헤드가 될 것이다 :

  1. 캐시 엔트리를 저장하는 메모리 비용; 최대 값의 사용은 Regex 생성시 다음과 같은 논리에 불과합니다.

    • 일반적으로 캐싱은 무엇입니까?
      • 그렇다면이 정규식을
      • 캐시로 최대 캐시 크기를 초과 했습니까?
        • 때문에, 캐시가 당신으로

          너무 오래 일치를 찾고 통과 할 마지막 캐시 항목


2. 증가 된 비용을 제거하는 경우 숫자가 터무니없는 것은 아닙니다. 우리는 내부 유형에 일반 목록으로 캐스팅해야하는 합병증을 피하기 위해 ICollection에 캐스트를 사용

public static int RegexCacheSize() 
    { 
     var fi = typeof(Regex).GetField("livecode", BindingFlags.Static 
                | BindingFlags.NonPublic); 
     var coll = (ICollection)(fi.GetValue(null)); 

     return coll.Count; 
    } 

:

다음은 현재 캐시 크기를 검색해야하는 것 반사 코드입니다.

관련 문제