2010-01-07 4 views
4

iPhone 응용 프로그램 (Xcode, Objective C++)의 느린 시작을 디버깅하고 있습니다. 탭이 세 개인 탭바 기반 앱입니다. 세 개의 탭은 모두 단일 NIB에로드됩니다. 총 약 20 개의 개체가 있습니다.iPhone에서 느린 시작

중요한 초기화의 첫 번째 라운드는 첫 번째 탭의보기 컨트롤러의 viewDidLoad 핸들러에서 수행됩니다. 그러나 main()과 해당 메소드의 시작 시간 (총로드 시간의 약 2/3) 사이에 약 1 초가 걸립니다. 질문 - 그 시간 동안 무슨 일이 벌어지고 있으며 어떻게 조사 할 수 있습니까? 내가 아는 바로는 두 순간 사이에 내 코드가 없습니다. 지연은 시스템 코드에서 완전히 발생합니다.

어쩌면 기능별 시간 프로필을 제공 할 수있는 일종의 계측기가 될 수 있습니까?

번들은 총 4MB 정도이지만 applicationDidFinishLaunching 처리기에서 가장 큰 파일 (~ 3.5MB)을로드하고 있습니다. 번들에서 해당 파일을 제거하고 관련 코드를 주석 처리하면 1 초 동안 지연되지 않습니다.

업데이트 : 결국 디버그 간섭이있었습니다. 콘솔을 보면서 장치에서 실행하면 시작 시간이 상당히 짧아지고 시스템 코드가 지연되는 비율이 너무 비뚤어집니다. 그러나 여전히 메인과 viewDidLoad 사이에는 눈에 띄는 지연이 있으며 총로드 시간의 약 50 %입니다.

큰 파일을 번들에서 메모리로 완전히로드하는 모든 방법 중에서 가장 빠른 방법은 직접 메모리 매핑 (POSIX mmap() 사용)이었습니다.

답변

4

여기에서 발생할 수있는 두 가지 사항이 있습니다. Xcode 내에서 응용 프로그램을 디버깅하는 경우 응용 프로그램이 시동시 GDB 디버거에 연결될 때까지 기다리는 것이 좋습니다. 내 경험으로는 약 1 초가 걸립니다. Xcode에서 "Build and Go"라고 말하지 않고 앱을 실행하고 결과가 다른지 확인하십시오. (대신 홈 화면에서 클릭하십시오.)

NIB 파일도 문제 일 수 있습니다. 20 개 개체가 너무 많지는 않지만 다른 모든 개체가 실패 할 경우 각 탭을 별도의 NIB 파일로 분리하는 것이 좋습니다. 기본 NIB 파일에서 참조되는 NIB 파일의 내용은 느리게로드되므로 앱은 선택 될 때까지 보이지 않는 두 개의 탭에 대한보기를로드하지 않습니다. 그것은 초당 성능에 도움이 될지 모르지만 시작시 성능이 향상 될 수 있습니다.

애플은 아이폰 SDK에서 훌륭한 성능 분석 도구를 가지고 있지만, 찾기가 어렵다. 실행 메뉴에서 "성능 도구로 실행"-> "CPU 샘플러"를 선택하십시오. 그러면 Instrument라고하는 별도의 응용 프로그램이 실행되어 모든 종류의 훌륭한 런타임 분석을 수행 할 수 있습니다. CPU 계측기를 선택하면 계측기 창의 아래쪽 절반은 앱에서 CPU 시간을 차지하는 항목을 분석합니다. 더블 클릭 기능을 사용하여 다이빙을 할 수 있으며 사용 된 사이클 비율을 라인별로 분석 할 수 있습니다. 특별히 문제의 원인에 대한 자세한 정보를 제공해야합니다.

+0

프로그램 내에서 시간을 계산하므로 디버거 간섭이 최소화되어야합니다. main()이 제어 할 때까지 디버거는 이미 연결되어 있어야합니다. 탭에 별도의 NIB를 사용하는 것이 좋지만 두 번째 탭과 세 번째 탭에서 모든 것을 제거해 보았습니다. 지연은 거의 동일했습니다. CPU 모니터를 실행했습니다. 해석하기가 어렵다. :(72 %의 시간이 mach_msg_trap에 소비된다고 말합니다. 그러나 시스템의 일반적인 "wait for event"기능이 아닙니까? –

+0

사실, 디버거가 특히 타이밍 시작시 심각한 간섭을 일으키는 것으로 나타났습니다. 제안은 콘솔에 시간을 기록하고 장치에서 수동으로 응용 프로그램을 시작하고 구성 도우미에서 장치의 콘솔 로그에있는 시간을 읽을 수 있도록하는 것입니다. –

+0

NSLog()를 사용하여 시간을 기록하고 있습니다. Organizer에 표시됩니까? –

0

xib 파일이 너무 큰 경우 순수한 코드로 UI를 작성하는 것이 좋습니다. 대용량 xib 파일은 시작 시간을 늦추고 xib에서 처음으로 개체를 사용할 때 앱 속도가 느려집니다.

내 프로젝트에서 xib를 사용하지 않습니다. 누군가 svn에서 xib를 변경했기 때문에 변경된 내용을 거의 찾을 수 없습니다. 즉, xib은 SVN과 잘 어울리지 않습니다.

0

세 개의 NIBS로 앱을 분할하는 것이 좋습니다. 탭 표시 줄 및 탭 표시 줄 컨트롤러가 첫 번째 실행시 표시되고 사용자가 처음으로 전환 할 때 다른 두 개를 지연로드합니다.

나는 이것을 달성하기 위해 Interface Builder에서 File >> Decompose Interface 함수를 사용할 수 있다고 믿는다.

+0

그것은 공식적인 라인입니다. 그러나 벤의 대답 아래에있는 주석을보십시오. –

4

시작하는 동안 실제로 실행되는 내용과 각 방법이 실행되는 데 걸리는 상대 시간에 대해 궁금한 경우 사용자 지정 DTrace 스크립트를 만들어이 내용을 추적 할 수 있습니다. 나는 그 일을 끝내기 위해 어떻게하는지 묘사한다. this article. 이 스크립트는 응용 프로그램이 -applicationDidFinishLaunching :의 시작부터 끝까지 순서대로 실행하는 모든 메서드를 해당 메서드에 소요 된 시간과 함께 표시합니다. 이 스크립트는 인스 트루먼 트에서 사용자 지정 인스트루먼트 또는 독립형 스크립트로 실행할 수 있습니다 (독립 실행 형 스크립트는 부하가있는 시스템에서 더 정확합니다).

이 접근법의 주된 경고는 iPhone OS 자체에서 DTrace에 대한 지원이 부족하다는 점을 감안할 때 시뮬레이터에서만 실행된다는 것입니다. 그러나 응용 프로그램이 시작할 때 물건이 실행되는 순서와 응용 프로그램이 각 방법에서 보낸 상대 시간을 추출 할 수 있어야합니다. 이렇게하면 응용 프로그램이 시작될 때 수행되는 비공개 API 호출이 표시되어 상황에 대한 추가 단서를 제공 할 수 있습니다.

튜닝 제안을 추가로 제안하려면 James Thomson의 기사 "How To Make Your iPhone App Launch Faster"을 읽어 보시기 바랍니다.

관련 문제