Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iPhone启动缓慢_Iphone_Performance - Fatal编程技术网

iPhone启动缓慢

iPhone启动缓慢,iphone,performance,Iphone,Performance,我正在调试iPhone应用程序(Xcode,Objective C++)的缓慢启动。这是一个基于tabbar的应用程序,有三个选项卡。所有三个选项卡都加载在一个NIB中—总共约20个对象 第一轮重要初始化在第一个选项卡的视图控制器的viewDidLoad处理程序中进行。但是,从main()到该方法的开始时间大约需要1秒——大约是总加载时间的2/3。问题-在这段时间内发生了什么,我如何调查(除了分步进行拆卸)?据我所知,在这两个时刻之间没有我的代码——延迟完全发生在系统代码中 也许某种仪器可以给我

我正在调试iPhone应用程序(Xcode,Objective C++)的缓慢启动。这是一个基于tabbar的应用程序,有三个选项卡。所有三个选项卡都加载在一个NIB中—总共约20个对象

第一轮重要初始化在第一个选项卡的视图控制器的viewDidLoad处理程序中进行。但是,从main()到该方法的开始时间大约需要1秒——大约是总加载时间的2/3。问题-在这段时间内发生了什么,我如何调查(除了分步进行拆卸)?据我所知,在这两个时刻之间没有我的代码——延迟完全发生在系统代码中

也许某种仪器可以给我每个函数的时间剖面图

捆绑包的总容量约为4 MB,但我在ApplicationIDFinishLaunching处理程序中加载的最大文件(约3.5 MB)比这个文件晚。从bundle中删除该文件并注释掉相关代码对于1秒延迟没有任何作用

更新:毕竟存在调试干扰。如果我在观看控制台的同时在设备上运行它,启动时间就会大大缩短,延迟的比例——系统代码占我代码的比例——也会发生偏差。但是,main和viewDidLoad之间仍然存在明显的延迟,大约占总加载时间的50%


顺便说一下,在所有将大文件从捆绑包完全加载到内存的方法中,最快的方法是直接内存映射(使用POSIX mmap())。

这里可能会发生两件事。如果您是在XCode中调试应用程序,那么应用程序很有可能在启动时等待连接到GDB调试器。根据我的经验,这大约需要一秒钟。试着运行你的应用程序,不要在XCode中说“构建并运行”,看看结果是否有任何不同。(只需在主屏幕上单击即可)

您的NIB文件也可能是问题所在。20个对象不是太多,但是如果所有其他的都失败了,你可以考虑将每个标签分解成一个单独的NIB文件。从主NIB文件引用的NIB文件的内容是延迟加载的,因此应用程序不会加载两个选项卡的视图,这两个选项卡在被选中之前是不可见的。这可能会让你在创业时获得一个性能提升,尽管我不认为这能占到整整一秒钟的时间


苹果在iphonesdk中有一些很棒的性能分析工具,但它们有点难找到。在运行菜单中,选择“使用性能工具运行”->“CPU采样器”。这将启动一个名为Instruments的单独应用程序,它允许您进行各种出色的运行时分析。当您选择了CPU仪器时,仪器窗口的下半部分将提供应用程序中占用CPU时间的详细信息。您可以双击函数深入了解它们,并获得所使用周期的%的逐行细分。它应该为您提供更多关于问题具体原因的信息。

如果您发现您的xib文件太大,我建议您使用纯代码构建UI。 大的xib文件肯定会减慢你的启动时间,当你第一次使用xib中的对象时,也会减慢你的应用程序


我不在我的项目中使用xib,因为当有人在svn中更改xib时,您很难找到更改的内容。也就是说,xib与SVN的关系不太好。

我建议将你的应用分成三个NIB;首先在启动时显示选项卡栏和选项卡栏控制器,然后在用户第一次切换到其他两个时延迟加载它们


我相信您可以使用Interface Builder中的File>>Decompose Interface功能来完成此任务。

如果您真的对启动期间执行的操作以及每个方法运行所需的相对时间感到好奇,您可以创建一个自定义DTrace脚本来跟踪此操作。我将在本章末尾介绍如何做到这一点。此脚本将显示应用程序从启动到-applicationdFinishLaunching:结束执行的每个方法,以及在该方法中花费的时间。您可以在Instruments中作为自定义工具运行此脚本,也可以作为独立脚本运行(独立脚本在加载的系统上更精确)

这种方法的主要警告是,鉴于iPhone操作系统本身目前缺乏对DTrace的支持,它只能在模拟器中运行。但是,您应该能够提取应用程序启动时的执行顺序,以及应用程序在每个方法中花费的相对时间。这甚至会显示在应用程序启动时进行的幕后私有API调用,这可能会提供一些关于发生了什么的额外线索


对于其他启动优化建议,我建议阅读James Thomson的文章。

我正在计算程序中的时间,因此调试器干扰应该最小。当main()获得控制时,调试器应该已经连接。我知道他们建议选项卡使用单独的笔尖,但我尝试删除第二个和第三个选项卡上的所有内容-延迟几乎相同。我运行了CPU监视器。有点难以解释(它说72%的时间都花在了mach_msg_陷阱下——但这不是系统的通用“等待事件”吗功能?事实上,我发现调试器确实会造成很大的干扰,特别是在计时启动时。我的建议是让您的代码将时间记录到控制台,在设备上手动启动应用程序,并在Organizer中从您的设备读取控制台日志中的计时。我已经在使用NSLog()记录时间。这会出现在管理器中吗?是的,如果您没有通过Xcode运行应用程序,NSLogs会转储到系统日志中,并且它们的结果在管理器中可见(我看到管理器有点滞后,因此您可能需要启动应用程序几次才能全部显示).天哪,我真不敢相信这是