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

반복문의 속도를 최적화하기 위한 방법중의 하나로 반복 횟수를 줄이는 것이 있습니다. 이에 대해서 제프 그린버그(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초 단축된 것을 알 수 있습니다.

HTML&CSS3 양용석 지음, 로드북 출판

HTML5에는 다양한 새로운 기술들이 제공되는데.. 이 책은 그 중에서 HTML5에서 새롭게 추가된 HTML Tag에 대해 상세히 설명하고 있습니다. CSS3에 대해서는 기본적인 내용만을 다루고 있습니다. HTML5와 CSS3에 대해서 매우 화려하지도 않은, 또한 매우 깊은 곳은 다루지 않으나 기 기본적인 내용이 왜(Why) 존재하는지 잘 설명되어 있는 책이라고 생각합니다. 특히 책 후반의 실제 웹 표준 사이트를 밑바닦부터 완전히 새롭게 구축해 나가는 내용은 매우 훌룡합니다.

사용자 삽입 이미지
 기존에 HMTL과 CSS를 알고 있다면 HTML5와 CSS3에 대해서 이 책을 통해 중요한 기본적인 내용을 살펴보고 실제로 웹 사이트를 만들어 보는 실습을 통해 더욱 깊이 있게 학습할 수 있는 책이라고 생각합니다. 저는 실습 부분에 대해서 2번 해 봤는데.. 처음할때는 실수가 많았으나 두번째에는 무난하게 진행할 수 있었습니다.