2017-02-16 4 views
0

클래스의 경우 현재 스캐너에서 작업중인 통역사에서 일하고 있습니다. 여러 번 호출하게 될 클래스이므로 속도 최적화가 필요합니다. 스캐너에서 작업자를 분류하려면 현재 토큰을 6 명 정도의 작업자와 비교해야합니다. 어떤 방법이 속도에 가장 적합하지만 가독성을 위해도 좋습니다.많은 수락 사례를 가장 잘 처리하는 방법

  1. 많은 모든 사업자의 문자 배열을 통해 if 문
  2. 루프의 경우와
  3. 스위치 문

비교 이들은 내가 생각할 수있는 유일한 경우입니다. 어떤 것이 가장 좋으며, 더 나은 접근 방법이 있다면 공유하십시오. # 2는 최소한의 코드 행을 차지하기 때문에 구현했습니다.

+7

문제가 있음을 입증 할 때까지 "속도"에 신경 쓰지 마십시오. 당신은 조숙 한 최적화 토끼 구멍에 내려 가고 있습니다. 내가 당신이라면 정규 표현식이나 문자 클래스를 사용할 것입니다. –

+1

switch 문은 단일 문자 렉서로 작업 할 때 가장 읽기 쉽고 오버 헤드가 상대적으로 낮은 IIRC가 발생합니다. 그냥 붙어. – Qix

+0

6 명의 운전자 만 속도 차이를 보게 될 것입니다. – 4castle

답변

1

현명한 필체 인식 스캐너는 switch 문을 기반으로합니다. 특수 문자를 직접 파서에 반환하면 사례 작업을 절약 할 수 있습니다.

switch (ch) // the next incoming character 
{ 
    case '+': 
    case '-': 
    case '*': 
    case '/': 
    case '%': 
    // etc. 
     return ch; 
    case 'A': 
    case 'B': 
    // ... 
    case 'Z': 
    case 'a': 
    case 'b': 
    // ... 
    case 'z': 
     // start of an identifier: accumulate it, with a do/while loop, 
     // save it somewhere, return IDENTIFIER 
     return IDENTIFIER; 
    case '0': 
    case '1': 
    // ... 
    case '9': 
     // start of a numeric literal: ... 
     return NUMERIC_LITERAL; 
    // etc. 
} 
-1

몇 가지 항목의 경우 차이가 작습니다. 아이템이 많은 경우 반드시 스위치를 사용해야합니다.

스위치에 5 개 이상의 항목이 포함되어 있으면 조회 테이블이나 해시 목록을 사용하여 구현됩니다. 즉, 모든 항목은 if의 목록과 비교하여 동일한 액세스 시간을 갖습니다. 마지막 항목은 이전 조건을 먼저 평가해야하므로 도달하는 데 더 많은 시간이 걸립니다.

마찬가지로 @Qix는 더 읽기 쉬운 switch으로 댓글을 달았습니다.

+2

이것은 도시의 신화입니다. Sun/Oracle Java 컴파일러는 'case'가 하나 뿐인 경우에도 'lookupswitch'opcode를 사용합니다. – EJP