성능향상을 위해 가장 먼저해야 될 일은 시스템에서 병목현상이 발생하는 


부분을 제거하는 것이다.
아래 코드는 네트워크 장비인 Gateway에서 Spam을 Filtering하는 기능이다.
/* isspam : mesg에서 패턴 pat가 나타나는지 Test하는 코드 */
int isspam (char *mesg) {
int i;
for (i = 0; i < npat; i++) {
if (strstr(mesg, pat[i]) != NULL) {
printf(“spam : match for ‘%s’\n”, pat[i]);
return i;
}
}
return 0;
}
위의 함수는 메일에 Spam문구가 없으면 0을 반환하고, 있으면 양수를 반환한다.
위의 코드는 strstr함수를 정의된 패턴의 수(npat)만큼 호출하여 메일의 내용을 처음부터 끝까지 검사한다.
char * strstr (const char *s1, const char *s2) {
int n;
n = strlen(s2);   // Get length of pattern
for (;;) {
s1 = strchr (s1, s2[0]);
if (s1 == NULL)
return NULL;
if (strncmp (s1, s2, n) == 0)
return (char *) s1;
s1++;
}
}
메일의 내용이 스팸문구를 포함하는지 확인하는 함수인 strstr함수는 strchr 함수를 통해 스팸문구의

첫문자가 나오는 부분을 찾고, strncmp함수를 이용하여 첫문자 이후의 내용이 스팸문구와 같은지 
비교한다.
위의 함수는 대부분의 경우에 만족할 만한 성능을 보여주지만, 스팸메시지만을 위해 사용한다면 
아래와 같은 과정을 통해 성능을 향상 시킬 수 있다.
1) 스팸문구의 패턴은 고정되어 있기 때문에, strlen함수를 통해 길이를 구할 필요가 없다.
2) strncmp 함수는 두 문자열의 내용만 비교하는 것이 아니라, 종결자(‘\0’)도 찾고, 길이도 계산한다.
3) strchr 함수의 경우도 문자를 찾으면서 동시에 종결자(‘\0’)를 찾는다.
위와 같은 이유들 때문에 strstr은 문자열이 길고, 패턴이 고정되어 있는 경우에는 오버헤드가 엄청나다.
또한 위의 방법은 패턴 하나하나에 대해 메일의 내용을 처음부터 끝까지 전부 탐색한다. 따라서 아래와 같이

루프를 뒤집어서 메일의 내용을 처음부터 끝까지 한 번 탐색하는 동안 내부 루프에서 모든 패턴을 검사하면 

성능을 개선할 수 있다.
int patlen[NPAT];
int starting[UCHAR_MAX + 1][NSTART];
int nstarting[UCHAR_MAX+1];
int isspam (char *mesg) {
int i, j, k;
unsigned char c;
for (j=0; (c = mesg[j]) != ‘\0’; j++) {
for (i=0; i<nstarting[c]; i++) {
k = starting[c][i];
if (memcmp(mesg+j, pat[k], patlen[k]) == 0) {
printf(“Spam : match for ‘%s’ \n”, pat[k]);
return 1;
}
}
}
return 0;
}
선행되어야 할 작업들.
1) 각각의 패턴들은 pat[] 배열에 저장이 되어 있다.
2) patlen[] 배열에는 각각의 패턴들의 길이가 미리 저장되어 있다.
3) starting[c][]배열에는 각 문자 c에 대해서 c로 시작하는 패턴들의 pat[] 배열의 index가 저장되어 있다.
4) nstarting[i]에는 i로 시작하는 패턴들의 갯수가 저장되어 있다.
위에서 사용되는 배열들의 구조는 아래와 같다. (예 : c로 시작하는 패턴)
nstarting:        starting:                                         patlen:                        pat:
[     ]             [     ][     ][     ][     ][     ]            [     ]                          [     ]
[     ]             [     ][     ][     ][     ][     ]            [     ]                          [     ]
[  3  ]      [‘c’][ 17 ][ 35 ][ 97 ][     ][     ]            [     ]                          [     ]
[     ]             [     ][     ][     ][     ][     ]            [     ]                          [     ]
[     ]             [     ][     ][     ][     ][     ]            [     ]                          [     ]
[     ]             [     ][     ][     ][     ][     ]            [     ]                          [     ]
[     ]             [     ][     ][     ][     ][     ]            [     ]                          [     ]
                                            :
                                            :
[     ]             [     ][     ][     ][     ][     ]            [     ]                          [     ]
[     ]             [     ][     ][     ][     ][     ]      [17][  4  ]                          [ — ] –>  [cow!]
[     ]             [     ][     ][     ][     ][     ]            [     ]                          [     ]
[     ]             [     ][     ][     ][     ][     ]            [     ]                          [     ]
[     ]             [     ][     ][     ][     ][     ]            [     ]                          [     ]
[     ]             [     ][     ][     ][     ][     ]            [     ]                          [     ]
                                            :
                                            :
[     ]             [     ][     ][     ][     ][     ]            [     ]                          [     ]
[     ]             [     ][     ][     ][     ][     ]            [     ]                          [     ]
[     ]             [     ][     ][     ][     ][     ]      [35][  9  ]                          [ — ] –>  [canival!]
[     ]             [     ][     ][     ][     ][     ]            [     ]                          [     ]
[     ]             [     ][     ][     ][     ][     ]            [     ]                          [     ]
[     ]             [     ][     ][     ][     ][     ]            [     ]                          [     ]
                                            :
                                            :
[     ]             [     ][     ][     ][     ][     ]            [     ]                          [     ]
[     ]             [     ][     ][     ][     ][     ]            [     ]                          [     ]
[     ]             [     ][     ][     ][     ][     ]            [     ]                          [     ]
[     ]             [     ][     ][     ][     ][     ]      [97][ 14 ]                          [ — ] –>  [collect money!]
[     ]             [     ][     ][     ][     ][     ]            [     ]                          [     ]
[     ]             [     ][     ][     ][     ][     ]            [     ]                          [     ]
Good Enough!!!
사실 Mail에서 Spam을 걸러내는 작업은 html code에서 tag를 걸러내는 작업과 비슷하다.

어떻게 위의 방법을 html code에서 tag를 걸러내는 작업에 적용할 수 있을지 생각해보자!!