2014-11-18 2 views
-3

질문은 if 진술의 비용과 비교하여 forwhile 루프의 비용을 비교할 것을 요구합니다.for 및 while 루프는 얼마나 비쌉니까?

if 문의 상대 비용이 1 인 경우 for 및 while 루프의 상대 비용은 얼마입니까?

비교할 때 하나의 부울 값이 while 루프와 if 문으로 전달되고 while이 X 회 반복 될 수 있다고 가정합니다. for도 X 번 반복한다고 가정합니다. 성능면에서

+11

[Microoptimizations are evil] (http://blog.codinghorror.com/the-sad-tragedy-of-micro-optimization-theater/) –

+2

대부분 http://stackoverflow.com/questions/1165457의 사본/java-for-loop-vs-while-loop-performance-difference –

+0

스스로 시간을 낼 수 있습니다 .. – Coffee

답변

9

if 문은 통상 n은 그것을 따라 얻어 루프의 양 조건이 무엇인지에 O forwhile 루프로 보통 (N) O를 (1) 복잡성의이다. 예 :

for (int i = 0; i < 100; i++) 
{ 
    // Some statements 
} 

100 회 반복되므로 O (100)가됩니다. 초기 루프 내부에 추가 루프가없는 경우 for 루프 내에서 얼마나 많은 명령문이 인지는 중요하지 않습니다. 그렇다면 O (n^2) 복잡도에 이르게됩니다. 이는 2 차적이므로 매우 비효율적입니다.

그러나이 두려움은 두려워하지 마십시오. 루프는 이유 때문에 존재하며, 많은 프로그램에서 루프가 필요합니다.

+0

@laiello - Nah .. 알아요. 너무 짧습니다. 어쩌면 우리는 재빨리 – Coffee

+0

을 재판 할 것입니다. 만약 당신이 100 번 루프를해야한다면 분명히 더 깨끗하고 100 문장이 될 것입니다. 또한 매우 집중적 인 작업을 수행하지 않는 한 오늘날의 컴퓨터와이 시간차는 간과 할 수 없습니다. – jgr208

+0

나는 동의한다. 그러나 나는 알고리즘 교수에게 가서 "루프 복잡성은 중요하지 않다"고 말했다. 전체 프로그램이 아닐 수도 있지만 컴퓨터 과학에서는 매우 중요합니다. –

0

루프는 언어 구문입니다. 루프 for과 동일한 작업을 수행하려면 while 루프를 쓰고 그 반대의 경우도 마찬가지입니다.

if 문의 상대 비용이 1 인 경우 for 및 while 루프의 상대 비용은 얼마입니까?

for 루프 및 while 루프도 조건을 검사합니다. 그런 의미에서 그들은 또한 1의 비용을 가지고 있습니다. 요점은 일반적으로 그 조건에 영향을 줄 루프에있는 것이 있다는 것입니다.

는 생성 된 바이트 코드가

// start for 
    0: iconst_0 
    1: istore_1 
    2: iload_1 
    3: bipush  10 
    5: if_icmpge  14 
    8: iinc   1, 1 
    11: goto   2 
    // end for 
    14: getstatic  #2     // Field java/lang/System.out:Ljava/io/PrintStream; 
    17: ldc   #3     // String 
    19: invokevirtual #4     // Method java/io/PrintStream.println:(Ljava/lang/String;)V 
    // start while 
    22: iconst_0 
    23: istore_1 
    24: iload_1 
    25: bipush  10 
    27: if_icmpge  36 
    30: iinc   1, 1 
    33: goto   24 
    36: return 
    // end while 

당신이 두 루프가 똑같은 일을 발견하고 동일한 바이트 코드를 생성 할 수 있습니다

public static void main(String[] args) throws Exception { 
    for (int i = 0; i < 10; i++) { 

    } 

    System.out.println(""); 

    int i = 0; 
    while (i < 10) { 
     i++; 
    } 
} 

이 코드를 고려하십시오.

관련 문제