2012-07-05 2 views
4

으로 바꿉니다. 중첩 된 문이 AND 문보다 우수한 지 궁금합니다. 나는 여러 번 반복되는 루프를 가지고 있기 때문에보다 빠른 실행이 가능할 것으로 생각하고있다. 아래 코드는 내 코드와 같은 논리입니다. 중첩 된 if 문은 루프 안에 있습니다.중첩 된 if 문을 AND

for (int i = 0; i < array.length; i++) 
    { 
     // do stuff 
     if (x == 5) 
     { 
     if (y == 3) 
     { 
      // do stuff 
     } 
     } 
    } 

내포 된 if를이 Statement로 바꾸면 내 코드가 더 빨리 차이가 날 수 있습니까?

 if ((x == 5) && (y == 3)) 
      // do stuff 

나는 이것을 link으로 읽었지만 대답을 찾지 못했습니다. 나는 학생이며 여전히 학습, 모든 의견을 주셔서 감사합니다!

답변

3

.NET을 사용하는 경우 먼저 널 체크를하고 생각하는 것이 더 자연 조건부가 false 인 경우 두 조건간에 성능 차이가 발생하지 않습니다.

+0

이 로직은 AND 구문에서도 발생합니까? – blenzcoffee

+0

그것이 내가 의미했던 것입니다. the와 성명서에서, 전반이 거짓이라면, 그것은 두 번째 절반을 확인하는 것을 괴롭히지 않을 것이다. – Tyrsius

+1

이것은 단락 회로라고 불리며 모든 논리 연산자는 가능할 때마다 단락합니다. 즉, 결과가 * 참/거짓이어야 함을 의미하므로 결과에 영향을 미치지 않으므로 다른 명령문의 실행을 즉시 중단합니다. – Servy

9

아니요, 성능에 큰 차이는 없지만 이지만은 가독성에 차이가있을 수 있습니다.

중첩 문 :

심지어 최적화하지 않고의 차이가 중요하지 않습니다
IL_0000: ldc.i4.5  
IL_0001: stloc.0  
IL_0002: ldc.i4.s 0A 
IL_0004: stloc.1  
IL_0005: ldloc.0  
IL_0006: ldc.i4.5  
IL_0007: bne.un.s IL_000D 
IL_0009: ldloc.1  
IL_000A: ldc.i4.3  
IL_000B: pop   

: (LINQPad와 함께 테스트) 최적화/릴리스로 컴파일 할 때

사람들은 모두 같은 IL를 생성합니다

IL_0001: ldc.i4.5  
IL_0002: stloc.0  
IL_0003: ldc.i4.s 0A 
IL_0005: stloc.1  
IL_0006: ldloc.0  
IL_0007: ldc.i4.5  
IL_0008: ceq   
IL_000A: ldc.i4.0  
IL_000B: ceq   
IL_000D: stloc.2  
IL_000E: ldloc.2  
IL_000F: brtrue.s IL_0020 
IL_0011: nop   
IL_0012: ldloc.1  
IL_0013: ldc.i4.3  
IL_0014: ceq   
IL_0016: ldc.i4.0  
IL_0017: ceq   
IL_0019: stloc.2  
IL_001A: ldloc.2  
IL_001B: brtrue.s IL_001F 
IL_001D: nop   
IL_001E: nop 

중첩되지 않은 상태 ements :

IL_0001: ldc.i4.5  
IL_0002: stloc.0  
IL_0003: ldc.i4.s 0A 
IL_0005: stloc.1  
IL_0006: ldloc.0  
IL_0007: ldc.i4.5  
IL_0008: bne.un.s IL_0013 
IL_000A: ldloc.1  
IL_000B: ldc.i4.3  
IL_000C: ceq   
IL_000E: ldc.i4.0  
IL_000F: ceq   
IL_0011: br.s  IL_0014 
IL_0013: ldc.i4.1  
IL_0014: nop   
IL_0015: stloc.2  
IL_0016: ldloc.2  
IL_0017: brtrue.s IL_001B 
IL_0019: nop 
+1

"하지만 가독성이 우수합니까?" :) – Almo

+0

@Almo, 모든 문장이 덜 읽을 수 있도록 할 필요가 없을 때 if 문을 중첩시켜 주겠다.하지만 주관적이다. :) –

+2

나는 동의하지만, 그러나 "가독성에 관해서"는 그렇지 않다. 어떤 의미가 있는지.그것은 가독성에 대해 논평하고 스스로 읽을 수 없기 때문에 아이러니 컬합니다. :) – Almo

3

아니요, 둘 사이에는 차이가 없습니다. 그러나, AND 적은 라인을하고 if의 더 나은 그리고 더 자연스럽게 느껴질 경우가 있습니다

, 하나의 일반적인 예는 다음과 같다 (당신이 많은 조건이 있음이없는 경우) 더 읽을 수 :

String s=//... 
if(s==null)return; 
if(s.Length > 0) //do something 

if ((s.Length > 0) && (s!=null)) //Dosomething 
:

if ((s!=null) && (s.Length > 0)) //Dosomething 

많은 개발자는이 실수를 수행는 AND와

, 이것은로 대체 될 수있다 당신이 볼 수 있듯이 null 참조 예외

에 종료됩니다

, 첫 번째 부분 경우 검사를 중지합니다 별도의 if

+0

때로는 XOR을 사용하는 것이 더 좋을 수도 있습니다.하지만 이식 가능하지는 않습니다 ... – Jasper

+0

사실 : 가독성이 우선입니다 – GETah

1

컴파일 된 코드에서 속도가 달라야하는 이유는 없습니다. 정확히 같은 어셈블리 코드로 변환됩니다. 가독성 요소에 대해서는 분명히 동의하며 클래스 길이도 단축 할 것입니다.