잠재적 성능 저하를 막는 해법은 매우 간단합니다. 계산이 많이 필요한 연산은 가능하면 적게 하세요.
위 예제에서는 메서드를 호출할 때 정규식을 딱 한 번만 컴파일하면 됩니다. 루프를 반복해도 표현식 문자열은 바뀌지 않으니까요.
다행히 Pattern API로 한 번에 쉽게 컴파일할 수 있습니다. 이렇게 하려면 Pattern.matches() 호출에 들어 있는 두 연산을 분해해야 합니다. 첫 번째는 표현식 컴파일이고 두 번째는 검색 문자열을 실행하는 부분입니다.
첫 번째 단계는 Pattern.compile() 호출로 추출해 Pattern의 인스턴스인 컴파일된 정규식을 생성합니다. 계산이 많이 필요한 단계이므로 이 결과를 지역 변수에 저장합니다.
두 번째 단계인 컴파일된 표현식 실행은 쉽고 빠른 연산입니다. 매 Supply 인스턴스마다 실행해야 할 연산이기도 하니 루프 본문에 넣습니다.
예제에서는 검색할 String을 위한 Matcher를 먼저 생성했습니다. Matcher는 다른 방식으로 심지어 반복해 검색할 수 있는 핸들입니다. 제품이 정규식과 부합하는지만 확인하면 되니 matches()를 호출하면 됩니다.
간단히 말해 정규식을 조금만 고쳐 사용하면 성능을 크게 높일 수 있습니다!