iPhone 응용 프로그램 (Xcode, Objective C++)의 느린 시작을 디버깅하고 있습니다. 탭이 세 개인 탭바 기반 앱입니다. 세 개의 탭은 모두 단일 NIB에로드됩니다. 총 약 20 개의 개체가 있습니다.iPhone에서 느린 시작
중요한 초기화의 첫 번째 라운드는 첫 번째 탭의보기 컨트롤러의 viewDidLoad 핸들러에서 수행됩니다. 그러나 main()과 해당 메소드의 시작 시간 (총로드 시간의 약 2/3) 사이에 약 1 초가 걸립니다. 질문 - 그 시간 동안 무슨 일이 벌어지고 있으며 어떻게 조사 할 수 있습니까? 내가 아는 바로는 두 순간 사이에 내 코드가 없습니다. 지연은 시스템 코드에서 완전히 발생합니다.
어쩌면 기능별 시간 프로필을 제공 할 수있는 일종의 계측기가 될 수 있습니까?
번들은 총 4MB 정도이지만 applicationDidFinishLaunching 처리기에서 가장 큰 파일 (~ 3.5MB)을로드하고 있습니다. 번들에서 해당 파일을 제거하고 관련 코드를 주석 처리하면 1 초 동안 지연되지 않습니다.
업데이트 : 결국 디버그 간섭이있었습니다. 콘솔을 보면서 장치에서 실행하면 시작 시간이 상당히 짧아지고 시스템 코드가 지연되는 비율이 너무 비뚤어집니다. 그러나 여전히 메인과 viewDidLoad 사이에는 눈에 띄는 지연이 있으며 총로드 시간의 약 50 %입니다.
큰 파일을 번들에서 메모리로 완전히로드하는 모든 방법 중에서 가장 빠른 방법은 직접 메모리 매핑 (POSIX mmap() 사용)이었습니다.
프로그램 내에서 시간을 계산하므로 디버거 간섭이 최소화되어야합니다. main()이 제어 할 때까지 디버거는 이미 연결되어 있어야합니다. 탭에 별도의 NIB를 사용하는 것이 좋지만 두 번째 탭과 세 번째 탭에서 모든 것을 제거해 보았습니다. 지연은 거의 동일했습니다. CPU 모니터를 실행했습니다. 해석하기가 어렵다. :(72 %의 시간이 mach_msg_trap에 소비된다고 말합니다. 그러나 시스템의 일반적인 "wait for event"기능이 아닙니까? –
사실, 디버거가 특히 타이밍 시작시 심각한 간섭을 일으키는 것으로 나타났습니다. 제안은 콘솔에 시간을 기록하고 장치에서 수동으로 응용 프로그램을 시작하고 구성 도우미에서 장치의 콘솔 로그에있는 시간을 읽을 수 있도록하는 것입니다. –
NSLog()를 사용하여 시간을 기록하고 있습니다. Organizer에 표시됩니까? –