반복문의 반복 횟수를 줄이는 코드 작성

반복문의 속도를 최적화하기 위한 방법중의 하나로 반복 횟수를 줄이는 것이 있습니다. 이에 대해서 제프 그린버그(Jeff Greenberg)가 제안한 내용이 있는데요. 처음 제안될때 작성된 샘플 코드가 C이지만 이를 JavaScript로 해석해 보았습니다. 먼저 개선해 나갈 반복문의 코드가 다음과 같습니다.

function task(arg) {
    var sum = 0;
    for (var i = 0; i < 10; i++) {
        sum += i;
    }
    return sum;
}

var start = +new Date();
var result = 0;
var repeatCounts = 9999999;

//========================================
for (var i = 0; i < repeatCounts; i++) {
    result += task(i);
}
//========================================

var end = +new Date();
var diff = end - start;
alert("result = " + result + ", " + diff + " msec");

최적화 대상이 되는 반복문은 13ㅡ17번입니다. 반복문 안에서 실해된 코드를 별도의 함수인 task로 뽑아놨습니다. task는 1부터 10까지의 합계를 구하는 간단한 연산을 수행하는 함수입니다. 반복문의 속도를 측정하기 위해서 반복문 앞뒤로 시간을 측정하고 있습니다. 이 반복문을 수행하였더니 제 타블릿PC에서는 8.6초가 나왔습니다. 이제 동일한 결과를 얻으면서도 반복 회수를 줄이는 방식으로 최적화를 한 코드는 다음과 같습니다. 위의 13ㅡ17번에 대한 반복 코드에 대한 변경된 부분만 언급하였습니다.

//========================================
var iters = Math.floor(repeatCounts / 10);
var startAt = repeatCounts % 10;
var i = 0;

do {
    switch (startAt) {
        case 0: result += task(i++);
        case 9: result += task(i++);
        case 8: result += task(i++);
        case 7: result += task(i++);
        case 6: result += task(i++);
        case 5: result += task(i++);
        case 4: result += task(i++);
        case 3: result += task(i++);
        case 2: result += task(i++);
        case 1: result += task(i++);
    }
    startAt = 0;
} while (iters--);
//====================================

한번의 반복으로 최대 10번의 반복을 대신하고 있습니다. switch 문을 보면 break문이 없다는 점을 유념해 해석해 보면 그 원리를 이해할 수 있습니다. 실행해 보면 소요되는 시간이 6.3초로 2.4초 단축된 것을 알 수 있습니다.

“반복문의 반복 횟수를 줄이는 코드 작성”에 대한 3개의 댓글

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다