如何加快MonoTouch编译时间?

这是众所周知的

如果编译甚至需要15秒钟,程序员会在编译器运行时感到厌烦,并切换到读取“洋葱” ,这将吸引他们,并杀死几个小时的生产力。

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

我们在解决scheme中有大约10个组件。
我们还用gcc_flags链接一些本地库。

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

我在问这个问题,希望有比我更好的知识的人能够编译(不是双关语意思)列表的技巧和东西来检查,以减lessdebugging版本的MonoTouch编译时间。

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

在Xamarin.iOS中构build时间的改进6.4

Xamarin.iOS 6.4具有显着的编译时间改进 ,现在只能将更新的代码位发送到设备。 你自己看:

建立时间改进

阅读更多内容,了解如何在Rolf的文章中启用增量构build。

进化2013video

这个内容的更新和扩展版本可以在我在2013年进化的高级iOS构build机制讲座的video中看到。

原始答复

有几个因素影响build造速度。 但是,其中大部分对设备构build有更多的影响,包括使用您提到的托pipe链接器。

被pipe理的链接器

对于设备,然后链接所有是最快的,其次是链接SDK和(在最后) 不要链接 。 原因是链接器可以比AOT编译器更快地消除代码(净增益)。 另外更小的.app将更快地上传到您的设备。

对于模拟器不要连接总是更快,因为没有AOT(使用JIT)。 你不应该使用其他的链接选项,除非你想testing它们(它比构build设备还要快)。

设备技巧

  • 构build单个体系结构(例如ARMv7)比FAT二进制(例如ARMv7 + ARMV7s)更快。 较小的应用程序也意味着更less的时间上传到设备;

  • 默认的 AOT编译器(mono)比使用LLVM编译器快很多。 但是后者会生成更好的代码,并且还支持ARMv7s,Thumb2;

  • 如果您的.app包含大量资源,那么部署/上传它们(每次必须签名后)都需要一段时间与您的应用程序配合使用。 我写了一篇关于如何解决这个问题的博客文章 – 如果您拥有大量资产,可以节省大量时间;

  • 对象文件caching是在MonoTouch 5.4中实现的。 有些版本会快很多,但其他版本不会(当caching必须被清除的时候)更快(但是不会更慢;-)。 更多的信息为什么这经常发生在这里 )。

  • 由于符号,运行dsymutil ,debugging版本花费更长的时间,并且由于结果变得更大,所以需要额外的时间上传到设备。

  • 发布版本默认情况下(你可以把它关掉),做一个IL组件。 这只需要一点时间 – 在部署(较小的.app)到设备时可能回来。

模拟器技巧

  • 就像前面所说的那样,尽量避免链接,因为它需要更多的时间,并且需要复制程序集(而不是将其链接)。

  • 使用本地库比较慢,因为在这种情况下,我们不能重用共享的simlauncher main可执行文件,并且需要gcc为应用程序编译一个(这很慢)。

最后每当有疑问的时候呢! 我的意思是你可以添加 – --time --time到你的项目extra mtouch arguments以查看每个操作后的时间戳:-)

这不是真正意义上的答案,而是一个临时占位符,直到有更好的答案。
我通过Seb发现了这个引用 :

看看你的项目的构build选项,并确保“链接器行为”是在默认的“链接SDK程序集”。

如果它显示“不要链接”,那么你会经历长的编译时间(在dsymutil中很大一部分)。

我不知道它是否还是相关的,因为MonoDevelop在我select这个选项时显示一个警告标志,而且对性能没有太大的影响。

你不能指望你的编译器在没有了解所有需要做的事情的情况下轻轻一点。 较大的应用程序自然需要更长时间。 相同语言的不同语言或不同编译器可以在编译代码所花费的时间上产生巨大的差异。

我们有一个需要将近2分钟才能完成的项目。 您的最佳解决scheme是找出一种方法来减less您编译代码的次数。

而不是试图修复一行代码和重build,一遍又一遍。 让一群人一起讨论这个问题。 或者创build一个你想要工作的3或4件事情的清单,完成它们然后testing。

这些只是一些build议,他们不会在所有情况下工作。