애용하는 에디터 노트패드++의 소스가 깃에 있어서 한번 들어가 보았다.
그중에 특정 문자열이 있는지 찾는 코드가 있는데 이것을 최적화 해보겠다.
1차 최적화는 다음과 같다.
bool IsInListA(const char *token, const char *list) { char word[64] = {0}; size_t i = 0; size_t j = 0; if ((!token) || (!list)) return false; for (size_t len = strlen(list); i <= len; i++) { word[j++] = list[i]; if ((list[i] == ' ')||(list[i] == '\0')) { if (!strnicmp(token, word, j)) return true; j = 0; } } return false; }
1. Function Name의 첫글자를 대문자로. 변수와 구분된다.
2. 괄호를 Allman Style로. 원본의 다른 부부은 Allman인데 88라인에서 Allman이 아니다.
2. 변수 선언부를 스코프 최상단에 모아 놓음.
3. for - if - if - if 의 4depth를 for - if - if 의 3depth로
4. else 문을 최대한 삭제하여 여기서는 하나도 쓰지 않았다.
소스의 로직 디자인을 거의 바꾸지 않고 최적화를 했지만 로직을 변경하면 더 최적화가 된다.
bool IsInListA(const char *token, const char *list) { size_t j = 0; if ((!token) || (!list)) return false; while (*list) { if (*list++ == token[j++]) { if (token[j] == 0x00) return true; } else { j = 0; } } return false; }
strcmp 류의 함수를 전혀 쓰지 않았다!
이 정도만으로도 충분하다고 생각하지만... 더 최적화할 수 있는 방안이 있을 것이다.
3중첩의 for-if-if 블럭이 눈에 거슬려서 더 바꿔볼 수는 있다.
bool IsInListA(const char *token, const char *list) { size_t j = 0; if ((!token) || (!list)) return false; while (*list) { if (*list++ != token[j++]) { j= 0; continue; } if (token[j] == 0x00) return true; } return false; }
중요한 것은 로직이 이런 식으로도 최적화 될수도 있다는 것이다.
'Tech' 카테고리의 다른 글
[기초] OpenSSL 해쉬 함수 사용 예제 (0) | 2018.07.29 |
---|---|
코드 정리 #7 (0) | 2018.07.29 |
코드 정리 #5 (0) | 2018.07.28 |
코드 정리 #4 (0) | 2018.07.28 |
다양한 LBP 소스가 있는 깃허브 레포지토리 (0) | 2018.07.27 |