210227_B책_순회하며 계산 집약적 연산하지 않기_2

정재현·2021년 2월 27일
0

TIL

목록 보기
79/80

어제에 이어서 진행한다.
먼저 오늘 진행하기에 앞서, 정규식과 Pattern, matches를 선행 학습해봤다.
참고한 url: https://coding-factory.tistory.com/529

class Inventory {
 private List<Supply> supplies = new ArrayList<>();
 
 List<Supply> find(String regex) {
  List<Supply> result = new LinkedList<>();
   for (Supply supply : supplies) {
    if (Pattern.matches(regex, supply.toString())) {
     result.add(supply)
    }
   }
   return result;
 }

자, 이 코드를 실행하면서 자바는 String 표현식인 regex를 가져와 regex로부터 특수한 목적의
오토마톤(automaton)을 만드는데,
이 오토마톤은 패턴을 따르는 문자열만 허용하고 나머지는 모두 거절한다.
정규식 오토마톤 컴파일은 클래스 컴파일처럼 시간과 처리 전력을 소모하는데,
위 코드에서는 for문 안에 들어가서 반복할 때마다 정규식을 컴파일 하고 있는 중이다.
=>(와.. 시간은 그렇다쳐도 처리 전력..?)

그렇다면 정규식을 반복해 컴파일하지 않으려면 어떡해야 할까?
어떻게 잠재적 성능 저하를 막아야 할까?

class Inventory {
 private List<Supply> supplies = new ArrayList<>();
 
 List<Supply> find(String regex) {
  List<Supply> result = new LinkedList<>();
  Pattern pattern = Pattern.compile(regex);
   for (Supply supply : supplies) {
    if (Pattern.matches(supply.toSting(),matches()) {
     result.add(supply);
    }
   }
   return result;
 }

해법은 계산이 많이 필요한 연산은 가급적 적게하는 것이다.
이렇게 반복문을 실행할 때 미리 컴파일해 놓은 정규식을 쓰면 된다.
다행히 Pattern API로 한 번에 쉽게 컴파일할 수 있었다.
Pattern.compile() 이 계산이 많이 필요한 단계이므로 지역변수에 저장하고,
if문에서 활용한다.

오늘의 코멘트: 새로운 개념들을 알게되서 좋다. 나중에 써먹을 수 있겠지?

profile
"돈받고 일하면 프로다"

0개의 댓글