2015-01-21 2 views
0

내 코드에서 파일 정렬을 수행 할 때 각 문자열의 첫 번째 요소를 비교하기 위해 strncmp을 사용했습니다.두 문장의 strncmp가 단일 문장보다 많은 시간이 걸린다

코드 1 :

for (i = 1; i < file_cnt;) 
{ 
    if ((strncmp(info[i-1].name, "1", 1) == 0) && 
     (strncmp(info[i].name, "2", 1) == 0)) 
    { 
    to do.... 
    i += 2; 
    } 
    else if ((strncmp(info[i-1].name, "2", 1) == 0) && 
      (strncmp(info[i].name, "1", 1) == 0)) 
    { 
    to do.... 
    i += 2; 
    } 
    ... 
} 

코드 2 :

for (i = 1; i < file_cnt;) 
{ 
    if (strncmp(info[i-1].name, "1", 1) == 0) 
    { 
    if (strncmp(info[i].name, "2", 1) == 0) 
    { 
     to do.... 
     i += 2; 
    } 
    } 
    else if (strncmp(info[i-1].name, "2", 1) == 0) 
    { 
    if (strncmp(info[i].name, "1", 1) == 0) 
    { 
     to do.... 
     i += 2; 
    } 
    } 
    ... 
} 

가 여기에 Code 2Code 1보다 상대적으로 더 많은 시간이 소요 여기에 내 코드를 포함

. 크로스 플랫폼 장치로 작업 중이므로 Code 2을 실행하면 코드의 다른 부분에 많은 문제가 발생합니다.

두 명령문 비교가 단일 명령문 비교보다 시간이 오래 걸리는 이유는 무엇입니까?

+1

당신이 사용하고있는 컴파일러 (2 코드) 프로그램이 느려지 며 추가 스택 프레임을 생성합니다 중첩? 최적화가 끝났습니까? 또한'strncmp()'를 사용하여 한 문자 만 비교하는 이유는 무엇입니까? 'char's를 직접 비교할 수 있습니다. –

+6

'strncmp'를 사용하지 않으면 * 더 빠르게 만들 수 있습니다. 두 문자 만 비교하기 때문에 (문자열 종결자를 잊지 마라.) if (info [i-1] .name [0] == '2'&& info [i - 1] ] .name [1] == '\ 0') ... ' –

+9

또한 두 개의 코드 스 니펫은 * 동등하지 않습니다. 첫 번째 코드 단편에서 첫 번째'if'의 두 번째'strncmp'가 거짓이면 코드는'else'로 이동합니다. 두 비교가 모두 참이면 코드를 수행합니다 (예 :'i + = 2'). 그러나 두 번째 코드 단편에서 첫 번째 바깥 쪽 'if'가 true이고 첫 번째 중첩 된 'if'조건이 거짓이면 ***이 아닌 ***이 else로 이동합니다. –

답변

1

코드 1에서는 연산자가 &&입니다. 명세는 첫 번째 표현식 (LHS)이 거짓으로 판명되면 두 번째 표현식을 평가하지 않는다는 것입니다. 이를 단락 회로 평가라고합니다. 따라서 코드 1의 첫 번째 표현식이 false이면 직접 else으로 이동합니다. 또한

, 당신의 문이 경우-

+4

이론적으로 두 번째 코드 스 니펫과 다르지 않습니다. 외부 if 표현식이 거짓 인 경우 두 번째 (중첩 된) 비교가 발생하지 않고 코드가 바로 'else'로 이동합니다. –

+1

코드 2에도 똑같이 적용됩니까? 즉, 첫 번째 'if'문이 거짓이면 내부의 두 번째 'if'문을 평가하지 않고 else 조건으로 이동합니다. –

+0

몇 년 동안의 단락 회로 평가에 대해 알고 있었지만 생각을 잊어 버리면 엉덩이를 때리는 경우가 있습니다. 최근에 작업이 고정 된 횟수만큼 재 시도되고 결국 시도 횟수가 기록됩니다. 재 시도 루프는'do {...} while (! operation_successful && (++ tries_count)

관련 문제