如何加快MonoTouch的编译时间?

c# xamarin.ios xamarin compilation-time

5415 观看

3回复

这是众所周知的是

如果编译甚至需要15秒,程序员将在编译器运行时感到无聊,并切换到阅读The Onion,这将使他们陷入困境,并浪费数小时的生产力。

我们的MonoTouch应用程序需要40秒钟才能在Debug / Simulator配置中的Macbook Air上进行编译。

解决方案中大约有10个程序集。
我们还将使用链接到某些本机库gcc_flags

我确信有一些我不知道的优化编译时间的方法,这可能与引用,链接器等有关。

我问这个问题是为了希望比我有更多知识的人能编译(没有双关语)清单和要检查的事项,以减少用于调试版本的MonoTouch编译时间。

不要建议硬件优化或与MonoTouch不直接相关的优化。

作者: Dan Abramov 的来源 发布者: 2019 年 9 月 30 日

回应 (3)


45

决定

Xamarin.iOS 6.4中的构建时间改进

Xamarin.iOS 6.4在构建时间上重大改进,现在可以选择仅将更新的代码发送到设备。你自己看:

建立时间改进
(来源:xamarin.com

阅读更多信息,并在Rolf的帖子中了解如何启用增量构建。

Evolve 2013影片

我在Evolve 2013上发表的Advanced iOS Build Mechanics演讲视频中可以看到此内容的更新和扩展版本。

原始答案

有几个因素会影响构建速度。但是,它们中的大多数对设备构建都有更大的影响,包括您提到的托管链接器的使用。

托管链接器

对于设备然后链接全部是最快的,其次是链接SDK和(在最后)不要链接。原因是链接程序消除代码的速度比AOT编译器生成代码的速度快(净收益)。此外,较小的.app将更快地上传到您的设备。

对于模拟器,因为没有AOT(使用了JIT),所以“不链接”总是更快。除非要测试它们,否则不应该使用其他链接选项(它比进行设备构建还要快)。

设备技巧

  • 构建单个架构(例如ARMv7)比FAT二进制文件(例如ARMv7 + ARMV7s)更快。较小的应用程序也意味着更少的时间上传到设备。

  • 默认 AOT编译器(单声道)比使用LLVM编译器快了很多。但是,后者将生成更好的代码,并支持ARMv7s,Thumb2。

  • 如果您的.app中捆绑有大量资产,则需要花费一些时间来将它们部署/上传到您的应用程序中(因为必须进行签名,因此需要每次)。我写了一篇关于如何解决此问题的博客文章 -如果您拥有大量资产,它可以节省很多时间;

  • 目标文件缓存是在MonoTouch 5.4中实现的。有些构建速度会快很多,而其他构建速度(必须清除高速缓存时)不会快(但永远不会慢;-)。更多信息为什么经常在这里发生)。

  • 由于符号,运行的原因,调试版本花费的时间更长,dsymutil并且由于最终变得更大,因此需要更多的时间来上载到设备。

  • 默认情况下,发布版本(您可以将其关闭)将对装配件进行IL剥离。这只需要一点时间-在将设备(较小的.app)部署到设备时可能会获得回报。

模拟器技巧

  • 如前所述,尝试避免链接,因为这将花费更多时间,并且需要复制程序集(而不是对其进行符号链接);

  • 使用本机库的速度较慢,因为在这种情况下我们无法重用共享的simlauncher主可执行文件,因此需要让gcc为应用程序编译一个(这很慢)。

终于有疑问的时候了!我的意思是,您可以将其添加--time --time到您的项目中,extra mtouch arguments以在每次操作后查看时间戳:-)

作者: poupou 发布者: 20.12.2012 02:14

4

这并不是真正的答案,而是一个临时的占位符,直到有更好的占位符为止。
我发现了Seb的这句话

查看项目的构建选项,并确保“链接器行为”为默认的“ Link SDK程序集”。

如果显示“不链接”,那么您将经历长的构建时间(其中很大一部分在dsymutil中)。

我不知道它是否仍然有用,因为当我选择此选项时,MonoDevelop会显示一个警告信号,并且似乎对性能影响不大。

作者: Dan Abramov 发布者: 19.12.2012 11:18

3

您不能期望您的编译器在不了解其需要做的所有事情的情况下快速完成。自然,较大的应用程序将花费更长的时间。不同的语言或相同语言的不同编译器可能会在编译代码所需的时间上产生巨大差异。

我们有一个项目,将花费近2分钟的时间进行编译。最好的解决方案是找出减少编译代码次数的方法。

而不是一遍又一遍地尝试修复1行代码并重建。召集一群人讨论这个问题。或创建要处理的3或4件事的列表,完成所有步骤然后进行测试。

这些只是一些建议,并非在所有情况下都有效。

作者: Jastill 发布者: 19.12.2012 11:35
32x32