'속도'에 해당되는 글 1건
2008.05.09 13:39
사용자 삽입 이미지
머드초보님의 블로그 포스트에서 알게된 책중에 자바 성능을 결정짓는 코딩 습관과 튜닝 이야기란 책이 있습니다. 제목이 너무 맘에 들어 바로 사서 요즘 출퇴근 길에 열독 하고 있습니다.  

잠 시 책 소개를 하자면, 초보 개발자 '나초보' 씨가 실력있는 선배 '김경험', '이튜닝' 같은 분들에게 하나씩 배워가는 스토리로 쓰여 있습니다. 참 읽기 편하네요. 저 역시 '나초보' 와 그닥 다를 바 없는 실력 형편없는 개발자인지라 공감도 많이 되고, 많이 읽으면서 배우고 있습니다. 저자이신 '이상민'님 정말 감사합니다. ;)

참 유용하니 꼭 읽어보시길 권해드립니다.

아무튼, 상당히 유용한 이야기들로 가득차 있는데요, 책 내용 중 간단하게 언급된 for문 관련 이야기중 ActionScript를 쓰는 개발자들에게도 유용할 것 같은 Tip 이라 포스팅해봅니다. (사실 저 같은 어리버리 개발자한테만 유용할지도?)
 
for문은 상당히 많이 쓰는 loop 중에 하나입니다.
하지만 프로그래머들이 흔히 간과할 수 있는 부분이 있습니다.
우선 for문에 대해서 알아봅시다.
for 루프를 사용하면, 특정의 범위의 값에 대한 변수의 반복 처리를 실행할 수가 있습니다.
for 명령문(statement)에는, 3 개의 식을 지정할 필요가 있습니다.
해당 식은,
1. 초기치로 설정하는 변수
2. 루프가 언제 종료하는지를 지정하는 조건문(conditional statement )
3. 각 루프로 변수의 값을 변경하는 식 입니다.
예를 들어, 다음의 코드는 5 회 루프 합니다. 변수 i 는 0 으로 시작되어, 4 로 끝납니다.
출력은 0 ~ 4 의 수치가 되어, 각 수치는 개별의 행에 출력됩니다.
 
출처 : flexdocs.kr


여기서 눈여겨 봐야할 것은 2번째 조건문 입니다.
만약 Array 에 값을 for 루프를 돌아 처리한다고 할 때, 흔히 아래와 같이 쓰게 됩니다.  



이 때 2번째 조건 명령문에 들어있는 dataArray.length 가 문제가 됩니다. 루프를 도는 도중에 계속 호출되어 배열의 길이를 알아오기 때문입니다.
이 것은 다음과 같이 변경하여 좀 더 빠르게 바꿀 수 가 있습니다.


변수 dataArrayLength에 배열의 길이를 담은 후에 조건문에 대입하므로서 불필요하게 dataArray.length 를 매번 호출하지 않아도 되죠.

이와 비슷한 경우가 종종 있을 경우가 있습니다.
예를 들어  Canvas에 있는 자식 객체들의 수를 구하기 위해 Container 클래스에 정의된 numChildren 속성을 호출한다던지 말이죠.
아래의 코드는 클릭 이벤트가 발생하면 클릭된 Canvas의 자식 객체에 대해서 어떤 동작을 하는 코드입니다.



이제 실제 테스트를 해보겠습니다.
테스트해본 코드는 다음과 같고요, 그 아래 실제 결과물로 이 포스트를 읽는 분들이 테스트를 해보세요!


(참고 : creationComplete 시에 init() 을 실행시켜 dataArray 에는 10,000,000개의 데이터를 넣었습니다.)

저는 length 사용시: 953ms, length 미사용시: 187ms  걸렸습니다. ;)



▲ 실제로 이 글을 읽는 분이 걸린 시간.

알고도 그냥 지나칠 수 있는 부분이니까 습관을 들이도록 합시다. ;)
긴 글 읽으신다고 고생하셨습니다.
신고
Creative Commons License
Creative Commons License
시드 | 2008.05.09 15:16 신고 | PERMALINK | EDIT/DEL | REPLY
오~~ 맨날 length로만 해결했다는 1人 -_ㅠ 속도차이가 심하게 나네요~~
좋은 정보 감사합니다~~!! 형~~ 닌텐도 팔고 밥사줘요~ ㅋㅋ
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.05.09 16:02 신고 | PERMALINK | EDIT/DEL
닌텐도 팔아서 뭐 남는다고..... ㅋ
남남남 | 2008.05.09 18:12 신고 | PERMALINK | EDIT/DEL | REPLY
저는 결과가 578ms,203ms 이렇게 나왔습니다.
컨디션 부분은 반복될때마다 다시 값을 계산하는군요...
오늘 처음 알았네요... 좋은 정보 감사합니다.
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.05.09 18:32 신고 | PERMALINK | EDIT/DEL
방문해주셔서 감사합니다. ;)
레이 | 2008.05.10 10:26 신고 | PERMALINK | EDIT/DEL | REPLY
length 사용시: 295ms
length 미사용시: 135ms
2배이상 차이나는군요... 좋은정보 감사합니다
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.05.10 10:39 신고 | PERMALINK | EDIT/DEL
제 회사 컴에서는 엄청난 차이를 보이던데, 레이님 컴에서는 2배정도의 차이가 아는군요 ;)
컴이 좋으신듯? ㅎㅎ
방문해 주셔서 감사합니다.
Favicon of http://blog.jidolstar.com BlogIcon 지돌스타 | 2008.05.10 14:19 신고 | PERMALINK | EDIT/DEL | REPLY
좋은글 감사해요. 저도 이것때문에 많이 애먹은적이 있어서요. ^^;
for 문뿐 아니라 XML node 참조할때도 마찬가지 입니다.

var myXML:XML =
<customers>
<customer>
<name>jidolstar</name>
<product>
<item id="1"><name>a</name></item>
<item id="2"><name>b</name></item>
<item id="3"><name>c</name></item>
<item id="4"><name>d</name></item>
</product>
</customer>
<customer>
......
</customers>

for each(var item:XML in myXML.customer.(name=="jidolstar").item )
{
trace("id="+item.@id + ", name" + item.name );
}

이런식보다.

var items:XML = myXML.customer.(name=="jidolstar").item;
for each( var item:XML in items )
{
trace("id="+item.@id + ", name" + item.name );
}

이 훨씬 빠르다는거~ ^^

반복하면서 하여튼 dom 형식으로 많이 접근하는 것보다는 참조변수를 만들어서 사용하는 방법이 훨씬 좋은 방법입니다.
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.05.10 22:32 신고 | PERMALINK | EDIT/DEL
좋은 예제 감사합니다.
루프시에 항상 조건을 따지는 것 같아요.
다른 루프문들도 한번 테스트 해봐야겠습니다.
후니 | 2008.05.13 11:25 신고 | PERMALINK | EDIT/DEL | REPLY
ㅋㅋ 재미있는 시험 마니 하는 구나 ㅋㅋ
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.05.13 13:05 신고 | PERMALINK | EDIT/DEL
부러워요? ㅋㅋㅋ
공상 | 2008.05.13 13:20 신고 | PERMALINK | EDIT/DEL | REPLY
위에 코드출력하는 플러그인은 어떻게 하는거에요?
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.05.13 13:33 신고 | PERMALINK | EDIT/DEL
열이아빠님 블로그 http://koko8829.tistory.com/305
여기 참고하시면 되겠습니다 ;)
후니 | 2008.05.13 17:11 신고 | PERMALINK | EDIT/DEL | REPLY
NDSL 팔아서 맛난거 사죠 ㅋㅋ
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.05.13 17:56 신고 | PERMALINK | EDIT/DEL
왜 이러셈. =_+
박스농사 | 2008.05.21 14:58 신고 | PERMALINK | EDIT/DEL | REPLY
난 왜 9배차이가 나는거지?..
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.05.21 15:02 신고 | PERMALINK | EDIT/DEL
컴이 구려서? ㅋ
Favicon of http://singah.tistory.com BlogIcon 싱아 | 2008.06.21 04:02 신고 | PERMALINK | EDIT/DEL | REPLY
250ms , 98ms 나오는구먼
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.06.21 08:51 신고 | PERMALINK | EDIT/DEL
오.. 컴 좋은가봐? ㅎ
Favicon of http://butterguy.tistory.com BlogIcon 버터백통 | 2008.06.25 11:13 신고 | PERMALINK | EDIT/DEL | REPLY
아하 그렇군요~~ 전혀 생각지도 못했던 곳이였는데 좋은 정보 감사합니다~~
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.06.25 11:40 신고 | PERMALINK | EDIT/DEL
방문 감사합니다 ;)
Favicon of http://2rang.tistory.com BlogIcon 꽃녀 | 2008.07.24 22:06 신고 | PERMALINK | EDIT/DEL | REPLY
아주 멋진 정보입니다.
많이 알고 갑니다 ^^
Favicon of http://warkyman.tistory.com BlogIcon 검쉰 | 2008.07.24 22:28 신고 | PERMALINK | EDIT/DEL
방문해주셔서 감사합니다. ;)
건찌 | 2009.11.25 15:10 신고 | PERMALINK | EDIT/DEL | REPLY
오오 좋은정보 감사요^^
- 덧글 좀..(굽신굽신) : 장문의 덧글은 트랙백을 이용해주세요 ;^)
Name
Password
Homepage
Secret
prev"" #1 next