BLOG main image
분류 전체보기 (92)
Cocoa Touch (11)
Cocoa (10)
Objective-C (13)
Swift (6)
Development (11)
Tools (11)
Books (7)
etc (21)
Application release (1)
Document Project (1)
106,256 Visitors up to today!
Today 14 hit, Yesterday 5 hit
daisy rss
tistory 티스토리 가입하기!
'맥 개발'에 해당되는 글 2건
2009. 4. 5. 19:26


Objective-C는 C/C++에 비해서 매우 동적인 언어에 속하는 편입니다. 동적인 속성은 속도를 희생해서 얻은 것이기도 합니다. 덕분에 Objective-C가 비교적 느린 언어라는 비판을 받기도 합니다. 하지만, 다른 부분이 너무 매력적이어서 그런 약간의 손해를 보고도  포기 할 수 없는 것을 어찌할까요.

그래서, 가끔 속도에 밀접한 코드를 작성할 때, 부분적으로 C/C++로 작성하기도 합니다. C/C++로 작성된 함수들은 Objective-C의 메소드 콜에 비해서 비교적 빠릅니다. Objective-C의 메소드 디스패치 프로세스에 대해서 잘 알면 좋을텐데 그 주제는 다음에 다뤄야 할것 같고, 일단 오늘의 주제인 메소드 콜 속도 향상을 위한 이야기를 계속 해볼께요.

특정한 루프 안에서 반복적으로 메소드를 계속 호출 할 때, 메소드 디스패치 프로세스를 타는 것은 참 비효율적일 수도 있습니다. 특히 요즘 같이 CPU 속도가 나날이 빨리지는 시대에 Mac OS X와 같은 데스크탑에서는 별로 의미가 없을지도 모릅니다만, iPhone의 경우라면 또 이야기가 달라질듯 합니다. 어떤 때는 물에 빠진 사람이 지푸라기라도 잡는 심정으로 메소드 콜 옵티마이징을 해야 할 경우가 생길지도 모르겠네요. (사실 이정도까지 가는 경우는 자주 보지는 못한듯 합니다만...)

여튼, 굳이 이 주제에 대해서 이야기를 하는 것은, 첫째, 옵티마이징 여지를 찾아보는 것과 동시에, 둘째, Objective-C의 안쪽을 조금 더 들여다보고 이해 할 수 있지 않을까 해서입니다.

여기서 질문 하나, C/C++을 같이 쓰는 방법으로 속도향상을 노릴 수 있지 않나요? 예, 실제로 그렇게 많이 쓰기도 하지만 단점이 있습니다. 아무래도 Objective-C객체의 데이터와 C/C++ 함수의 코드가 따로 분리되어서 처리되기 때문에 모양이 별로 좋지 않아집니다. 비용이 C함수 호출하는 것과 거의 비슷한데 Objective-C 고유의 객체지향 속성을 버리지 않아도 된다면 차라리 이쪽을 선택하는 것이 낫지 않을까요?


이 테스트를 위해서 간단한 샘플 코드를 하나 작성했습니다.


- (NSInteger)accumulate:(NSInteger)aValue

{

    mSum += aValue;

    return mSum;

}


실제 수행을 위한 메소드는 위와 같습니다. 옵티마아징을 할 때도 이 코드는 수정하지 않겠습니다. (mSum은 맴버 변수입니다.)


NSInteger i;

for (i = 0; i < 100000; i++)

{

    [self accumulate:i];

    [self accumulate:i];

    [self accumulate:i];

    [self accumulate:i];

    [self accumulate:i];

    [self accumulate:i];

}


이쪽은 반복해서 특정 메소드를 호출하는 코드입니다. 예~ 인정합니다. 테스트 목적에 맞춰서 조금 무리하게(?) 코드를 끼워 맞췄습니다. 즉, 굳이 다른 부분에 CPU를 안쓰게하고 accumulate를 호출하는데 CPU를 많이 쓰게 유도했습니다. 60만번 호출이라면 엄청 많은 편에 속할듯 합니다. 일반적인 경우에서 이만큼 호출 하는 경우가 잘 있나 싶을 정도입니다. (이미지 프로세싱을 할때면 또 모르겠네요.) 60만번을 메소드 디스패치 프로세스를 탈 이유는 없어보입니다. (하지만 테스트를 하면서 하나 놀란 것이 메소드 디스패치 프로세스를 60만번 타는 속도가 생각보다 매우 빨랐다는 겁니다. ^^ ) 제 기계에서 (2.0GHz G5 X 2, 그래봐야 하나 밖에 안 썼겠지만...) 0.032초 걸렸네요. 이거 뭐, 거의 무시해도 되지 않나 싶은데... 여튼, 그래도 칼을 뽑았으니 옵티마이징 하면 어떻게 되나 한번 봅시다.


    NSInteger i;


    typedef void (*FuncPtr)(id, SEL, int);

    SEL sel = @selector(accumulate:);

    FuncPtr func = (FuncPtr)[self methodForSelector:sel];

    

    for (i = 0; i < 100000; i++)

        func(self, sel, i);

        func(self, sel, i);

        func(self, sel, i);

        func(self, sel, i);

        func(self, sel, i);

        func(self, sel, i);

    }


먼저, 간단하게 설명하지만 다음과 같은 단계를 거칩니다.


1. 호출하고자 하는 메소드의 셀렉터를 구합니다.

2. methodForSelector 메소드(클래스 오브젝트만 안다면 instanceMethodForSelector 메소드)를 이용해서  함수의 포인터를 얻습니다.

3. 함수를 호출합니다. 첫번째 파라메터는 리시버, 두번째 파라메터는 셀렉터, 그리고 변수들이 들어갑니다.


이렇게 작동시켜서 얻은 소요시간은 0.018초, 비율로 보면 상당히 줄었으나 만일 호출되는 메소드가 복잡해지고(그쪽이 CPU를 사용하는 비중이 늘어나고) 메소드 디스패치 프로세스를 이용하는 횟수가 줄어든다면(디스패치가 사용하는 CPU시간이 줄어들면) 전체적으로 봤을때 의미있는 성능향상을 보기는 쉽지 않을듯 합니다. 아이폰에서 아주 속도에 민감한 경우, 의미있는 결과를 얻을 수 있을지는 모르겠습니다. :)


Name
Password
Homepage
Secret
2008. 9. 4. 16:06
[etc]
내가 처음 맥 개발자 모임(현재 osxdev)를 만든 것이 2001년 1월이었다. Mac OS X이 아직 베타도 나오지 않을 때 였으니 꽤 빨랐던 샘이다. 몇몇 뜻이 있는 개발자들과 함께 시작했던 그 사이트는 제대로 된 서버도 없어서 사무실에 내 데스크탑 컴퓨터에서 운영되어서 퇴근 시간 이후에는 종종 꺼지기도 했었다. 오래지 않아 서버 장비도 구하고 나중에 모회사로 부터 지원을 받아서 IDC에 입주하게 되고 지금까지 쭉 운영되어 오고 있다. 비록 지금은 운영에서 손을 땐 상태이지만 항상 관심이 가는 사이트이기도 하다. 맥이라는것 자체가 매우 더물었던 시절 몇몇 개발자들의 보금자리였던 그런 동호회였다. (지금 내가 하고 있는 팀 블로그 cocomelo도 osxdev 초기 맴버들로 이루어진 팀이다.)
운영 초기부터 기본 운영 방침은 공개와 공유, 민주적 운영이었다. 덕분에 운영진도 여러차례 바뀌기도 하고 우여곡절도 있었다. 그런데 최근 새로 생겨나는 몇몇 맥/아이폰 개발 모임들을 지켜보면서 씁쓸한 마음을 감출 수 없다. 일단, 기본 자세가 안되어있다고 감히 말 하고 싶다.
인텔맥이 처음 나온다고 했을 때 종암님과 이런 저런 이야기를 나누면서 장단점이 뭐가 있을까 이야기를 하던 중 장점으로 앞으로 맥 개발자들이 많이 늘어날 것이고 단점으로는 그당시 우리의 마음과는 같지 않은 사람들도 많아 질 것이라고 이야기 했던 것이 기억난다.
많건 적건 osxdev는 그래도 이때까지 국내 맥 개발자들을 양성해왔고 자료들을 만들어 내 왔다. 게다가 자기가 필요할때만 와서 정보를 얻어가는 그런 사람들로 모인 모임이 아니었다. 기본적으로 모든 정보에 대해서 공개적이었으며 심지어 인터넷 여기저기 흩어저 불펌되어 간 맥 개발 관련 자료들 상당수에도 한번도 그 저작권이나 열람권에 제한을 가했던 적이 없었다.
워낙 힘들 때 자료도 없이 공부해본 사람들이라 사소한 자료라도 얼마나 소중한지 가치를 알고 또 그것을 공유하고자 하는 마음이 컸다. 맥 개발 관련 한글 자료가 없다고 투정부리는 요즘 추세에서 보면 상상도 못 할 수준이었다. 애플도 제대로 된 도큐먼트를 내놓지 않았고 한글로 된 책은 거녕 영문 책도 한 권 안나왔을 때 부터 맥 개발자들은 서로 정보를 공유하며 유대관계를 만들어가고 있었다.
그런데 요즘 현실은 어떠한가? 대부분의 신생 맥 개발 모임들은 특이하게도 모두 회원 이외에게는 자료를 공개하지 않는것 같다. 도대체 무슨 대단한 비밀 자료들을 가지고 있는 것일까? 심지어 자신의 모임을 홍보하기 위해서 다른 모임에 가입하는 사람들 조차 있다. - 물론 홍보 이외의 다른 활동은 하지 않는듯 보인다.
도대체 그 동안 오픈소스 진영이나 이 바닥에서 이루어 놓은 그 많은 정신적 산물들은 어디 간 것일까? 맥/아이폰 개발에 대한 노하우가 그렇게 대단하고 꼬불쳐 놓고 싶은 것일까? 그런 마음이었다면, 이런 블로그도 다 때려치웠을 것이다. 자신들을 가르쳐 줄 강사를 구하면서 어떻게 자신들이 이뤄놓은 혹은 앞으로 이룰 정보들에 대해서는 꽁꽁 자물쇠를 채우는 것일까? 편 가르기를 하고 싶은 것일까? 그렇다면 차라리 나는 유료 강사로 나설까 보다.
나로서는 도저히 이해되지 않는 행동들이다.
박종암 | 2008.09.05 01:56 | PERMALINK | EDIT/DEL | REPLY
앗! 민감한 이야기를!!!!
han9kin | 2008.09.08 12:19 신고 | PERMALINK | EDIT/DEL | REPLY
흠칫-
assam258 | 2008.09.08 12:54 신고 | PERMALINK | EDIT/DEL | REPLY
공개를 결정하기 이전에, 아무것도 없는 것일지도... ^^
Jenix | 2008.09.16 13:15 | PERMALINK | EDIT/DEL | REPLY
단순한 제 추측일 뿐이지만,
요즘 생겨나는 모임들은 순수한 개발 모임이라기보단
금전적인 무언가와 결합을 시키고 싶어하는 듯 싶어요 =_=

그래서.. 회원모집에 급급하고 자료들도 공개안하려고하고..
(그래봤자 그렇게 대단할건 없다고 저도 생각하지만..)
littlehj | 2008.09.16 16:53 신고 | PERMALINK | EDIT/DEL | REPLY
금전적으로 연결할려면 그에 맞는 패기와 실력이 있어야 하지 않을까요? 점점 깊이는 없는 것 같고 자꾸 이상한 분위기만 집단으로 노출되는 듯한 느낌을 많이 받네요. 패기와 실력이 있으면 더욱 좋을 것 이고 거기에 좋은 개발자 커뮤니티처럼 겸손함이 함께 묻어난다면 .....
박종암 | 2008.09.18 06:22 | PERMALINK | EDIT/DEL | REPLY
퀵타임라이브공작단에 생각해 볼만한 글이 있어 링크합니다.
http://www.qts.co.kr/2616

근데 아무래도 하수가 실제 세상에서는 힘을 더 발휘하는거 같다는.....
maccrazy | 2008.09.18 09:36 신고 | PERMALINK | EDIT/DEL
뭐... 어제 오늘 일은 아니겠지요. :)
너무 답답해서 한 마디 했지만 저는 그냥 제 할 일만 할려구요.
박종암 | 2008.09.18 10:52 | PERMALINK | EDIT/DEL | REPLY
:) 그래요. 우리는 우리 것을 잘해야죠. 제가 한국 BBS등의 활동을 해서 얻은 것은 그거더라구요. 맨처음엔 같이 공유하고 같이 자극해서 서로 잘되보자였는데, 그렇게 하지 못하는 사람들의 행태에 기분이 언짢다고 푸념하면서 시간보내다가, 그게 무슨 소용인가 나만 잘되면 되지.. 어딘가는 또 실력있는 사람들이 조용히 있고, 그들도 같은 생각할텐데.. 그렇게 된거죠. 그러다가 창기님도 알게 된거고, 그밖에 osxdev의 좋은 분들도 알게 된거구요. 그런데 요새 돌아가는 모습을 보면.. 영...

근데 창기님.. 저 iPod touch 하나 살까봐요.
이틀동안 회사 옆의 Apple Store에 가서 만지작 만지작했거든요.
시뮬레이터로 만족할까.. 어차피 iPhone이나 touch에는 프로그램을 못올리고 app store를 통해서 하는데...
혹 사셨나요? 개발자 본인은 App Store에서 다운받을때 돈 내야하나요?
아니면 다른 사람들에게 공개하기 전에 잠시 막아두는 모드가 있나요?
아니면 jail breaking을 해도 app store등을 계속 쓸 수있나요?
maccrazy | 2008.09.18 12:04 신고 | PERMALINK | EDIT/DEL
저도 아직 잘 몰라요. :) 아이팟 터치 2세대 주문 해놓은 상태인데... 개발 이외에 배포 같은데 별 관심이 없다보니 아직 앱스토어나 제일브레이크 작동 방식이나 제약사항에는 크게 관심을 못 기울였네요. 이제 슬슬 봐야죠.
박종암 | 2008.09.19 05:58 | PERMALINK | EDIT/DEL | REPLY
좀 살펴보았는데요, Apple에서 certification을 받으면, 그것을 keychain에 등록시켜 놓은 후, iPod touch/iPhone에 전송해서 테스트 해 볼 수있다는군요.
살까 말까 하다가... 8GB가 229$인데 세금붙이고, 케이스하고 보호 필름 사고 하면 (미국은 이런 악세사리들 값이 너무 비싸요) 거의 300$ 가까이 가더군요. 빨리 차를 return해 버리던가해야지. Toyota 차 하나 하고 매달 iPod touch를 사는 셈이니까요. 더군다나 이왕이면 iPod touch로 문서를 많이 가지고 다니면서 보고 싶은데, 문서보기엔 너무 답답하더군요. 눈도 아프고..

참.. iPod touch/iPhone 용으로 PDF 리더 만드는거 어떨까요? 현재 방식은 너무 불편한거 같더군요. 근데 왜 Adobe나 Apple이 standalone PDF viewer를 안만들었는지.. 라이센스 문제가 있나요?
Name
Password
Homepage
Secret
prev"" #1 next