본문 바로가기

Tech

코드 정리 #6

애용하는 에디터 노트패드++의 소스가 깃에 있어서 한번 들어가 보았다.

 

그중에 특정 문자열이 있는지 찾는 코드가 있는데 이것을 최적화 해보겠다.

 

 

 

 

출처 : https://github.com/notepad-plus-plus/notepad-plus-plus/blob/master/PowerEditor/src/EncodingMapper.cpp

 

 

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