. GetPrevOff

이전 문자를 찾는 GetPrevOff 함수는 문자의 경계에 걸치는 것을 방지하기 위해 항상 버퍼의 처음부터 문자들을 검색하도록 되어 있다. MBCS에서 이전 문자를 정확하게 찾기 위해서는 이 방법이 가장 확실하기는 하나 문서 길이가 길어지면 너무 비효율적임을 쉽게 직감할 수 있을 것이다.

굳이 문서의 처음부터 시작할 필요는 없으며 문자의 경계가 아님을 확신할 수 있는 곳이라면 적당히 앞에서부터 시작해도 된다. 그래서 앞쪽으로 가장 가까운 개행코드를 찾은 후 개행코드 이후부터 검색하도록 수정하였다.

 

int GetPrevOff(int nPos)

{

     int n, size;

 

     if (nPos==0) {

          return 0;

     }

 

    for (n=nPos-1;n!=0;n--) {

        if (buf[n]==‘\r’ && buf[n+1]==‘\n’) {

            break;

        }

    }

 

    for (;;) {

          if (IsDBCS(n)) {

               size=2;

          } else {

               size=1;

          }

          n+=size;

          if (n >= nPos)

               break;

     }

     return n-size;

}

 

앞 줄의 개행코드부터 검색을 시작하므로 확실하게 문자의 경계에 걸치지 않게 될 것이다. 이 함수를 수정함에 따라 왼쪽 이동과 BS 처리가 더 빨라지는 것은 사실이지만 그 차이를 체감하는 것은 거의 불가능하다. 왜냐하면 이 함수가 호출되는 시점은 루프 내에서가 아니라 사용자가 왼쪽 커서이동키를 누를 때인데 아무리 키를 빨리 눌러도 이 함수의 동작시간보다 빨리 누를 수는 없기 때문이다.

문득 이런 얘기가 생각난다. 갑과 을이 호젓한 산길을 걷다가 곰을 만났다. 을이 먼저 곰을 발견했는데 갑에게 말도 하지 않고 혼자서 뛰었다. 곧이어 갑도 곰을 발견하고 같이 뛰기 시작했다. 갑이 을을 앞지르려 하자 을이 니가 그렇게 뛰어봤자 곰보다 빨리 뛸 수 있을 것 같아?, 그러자 갑이 누가 곰보다 빨리 뛴 데? 너보다 빨리 뛰기만 하면 돼!. 사용자가 호출하는 함수는 사용자보다 빠르기만 하면 별 문제가 없으므로 속도개선의 우선 순위를 늦게 잡아도 상관없다.