【问题标题】:iOS slow startup timeiOS 启动时间慢
【发布时间】:2017-07-29 10:55:08
【问题描述】:

我在 Swift 中有项目,当我使用 DYLD_PRINT_STATISTICS 进行测量时,我可以看到 1.0 秒的预初始化时间,其中 70% 是动态库链接。

是否有任何干净和安全的方法来处理这个问题?

【问题讨论】:

  • Cocoapods 我想,你用那个吗?
  • 很可能是链接框架。没有更具体的信息,我无法给出更具体的答案。也就是说,上面的WWDC 2017 Session 很有启发性。
  • @J.Doe cocoapods 确实如此。但是如果我手动添加库,它不会解决问题,因为动态链接将以一种或另一种方式存在。我遇到了将所有 pod 转换为静态库的解决方案。但这在我看来并不是一个干净的解决方案
  • @BrandonBradley 感谢您提供的链接,我会检查一下。什么信息可能有用?我会提供的
  • @Roma 我突然想到,您运行 macOS High Sierra 测试版的可能性很小,这就是会话的主题(我的错)。相反,我会推荐去年 WWDC 中的Optimizing App Startup Time。本次演讲最有用的部分可能从 27:30 开始。会话通过一个太慢的应用程序,并大大加快了它。具体而言,我指的是库的数量、原始启动时间、是否使用 ObjC / C++ 以及您是否有权访问库源代码。

标签: ios swift swift3 dyld app-startup


【解决方案1】:

根据 Apple 在 Optimizing App Startup Time 上的 WWDC 2016 会议,无论大小如何,拥有大量 dynamically linked libraries 都会显着减慢应用程序的启动时间。

要解决此问题,可以将多个动态库合并到一个库中。如果它们已经是static libraries,则可以使用 libtool 组合它们,使用来自this SO answer 的命令。但是,如果它们不是静态的,那么要将它们组合起来,就必须能够访问它们的源代码。如果源代码可以访问,那么将代码从一个库复制到另一个库并使用生成的库就足够了。

当然,从开发人员的角度来看,将不同的库合并到一个库中肯定是不方便的。为了解决这个问题,Xcode 允许在设置不同的标志(即 RELEASE 和 DEBUG)时链接不同的库,as described in this forum

如果可能,最好合并静态库,因为合并过程更不容易出错。 CocoaPods allows users to use static libraries 在他们的项目中。

【讨论】:

  • 请注意,自它们以来,加载时间已得到改善。延迟加载 dylib,而不是从您的 appdelegate 引用整个应用程序可以减少应用程序需要响应的时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-30
  • 2013-10-01
  • 2013-12-24
  • 1970-01-01
  • 2018-03-06
  • 2016-09-01
  • 1970-01-01
相关资源
最近更新 更多