2012-06-22 2 views
2

나는 enwik8 및 enwik9에서 일부 정규식을 수행하기 위해 C로 코드를 작성하고 있습니다. 또한 벤치 마크 목적을 위해 다른 언어로 동일한 알고리즘을 만들고 있습니다. 문제는 파이썬과 다른 사람들이 단지 10 초가 걸린다면 40 초가 걸리기 때문에 C 코드에 문제가 있다는 것입니다.C 정규식 성능

무엇을 잊어 버리시겠습니까?

#include <stdio.h> 
#include <regex.h> 

#define size 1024 

int main(int argc, char **argv){ 
    FILE *fp; 
    char line[size]; 
    regex_t re; 
    int x; 
    const char *filename = "enwik8"; 
    const char *strings[] = {"\bhome\b", "\bdear\b", "\bhouse\b", "\bdog\b", "\bcat\b", "\bblue\b", "\bred\b", "\bgreen\b", "\bbox\b", "\bwoman\b", "\bman\b", "\bwomen\b", "\bfull\b", "\bempty\b", "\bleft\b", "\bright\b", "\btop\b", "\bhelp\b", "\bneed\b", "\bwrite\b", "\bread\b", "\btalk\b", "\bgo\b", "\bstay\b", "\bupper\b", "\blower\b", "\bI\b", "\byou\b", "\bhe\b", "\bshe\b", "\bwe\b", "\bthey\b"}; 

    for(x = 0; x < 33; x++){ 
     if(regcomp(&re, strings[x], REG_EXTENDED) != 0){ 
      printf("Failed to compile regex '%s'\n", strings[x]); 

      return -1; 
     } 

     fp = fopen(filename, "r"); 

     if(fp == 0){ 
      printf("Failed to open file %s\n", filename); 

      return -1; 
     } 

     while((fgets(line, size, fp)) != NULL){ 
      regexec(&re, line, 0, NULL, 0); 
     } 
    } 

    return 0; 
} 
+0

파이썬 외에도 동일한 정규 표현식 라이브러리를 사용하고 있습니까? regfree 잊지 마세요. –

+2

또한 같은 파일을 닫지 않고 33 번 열려고 했습니까? –

+0

당신 말이 맞아요, 그건 아마 내 성능 문제 야. –

답변

3

파일 액세스 및 정규식 컴파일은 아마 범인입니다.

  • 번 정규식 등에서 특정 요소를 뽑아 오기를 컴파일하고
  • 이 파일을 닫습니다 이상
  • 이 선
  • 실행할 때마다 컴파일 된 정규식을 읽을 파일을 열 배열에 저장합니다.
+0

+1 루프를 뒤집습니다. –