如何加快MonoTouch编译时间?

时间:2012-12-19 22:47:58

标签: c# xamarin.ios xamarin compilation-time

well known

  

如果编译需要15秒,程序员将在编译器运行时感到无聊并切换到阅读The Onion,这会吸引他们并消耗数小时的生产力。

我们的MonoTouch应用程序在调试/模拟器配置中需要40秒才能在Macbook Air上进行编译。

我们在解决方案中有大约10个组件 我们还使用gcc_flags与一些本地库进行链接。

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

我正在问这个问题,希望知识比我更好的人编译(没有双关语)一系列提示和事项要检查以减少调试版本的MonoTouch编译时间。

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

3 个答案:

答案 0 :(得分:45)

  

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

     

Xamarin.iOS 6.4有significant build time improvements,现在可以选择只向设备发送更新的代码。亲眼看看:

     

Built time improvements

     

阅读更多内容并了解如何在Rolf's post中启用增量构建。

Evolve 2013 Video

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

原始答案

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

托管链接器

对于设备全部链接最快,其次是链接SDK 和(最后)不要链路即可。原因是链接器可以比AOT编译器更快地消除代码(净增益)。此外,较小的.app会更快地上传到您的设备。

对于模拟器不要链接总是更快,因为没有AOT(使用JIT)。您不应该使用其他链接选项,除非您想测试它们(它仍然比进行设备构建更快)。

设备技巧

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

  • 默认 AOT编译器(单声道)比使用LLVM编译器快得多。然而,后者将生成更好的代码并且还支持ARMv7s,Thumb2;

  • 如果您的.app中捆绑了大型资产,那么部署/上传它们(每次必须签署)都需要一段时间才能与您的应用配合使用。我写了blog post如何解决这个问题 - 如果你拥有大量资产,它可以节省大量时间;

  • 目标文件缓存是在MonoTouch 5.4中实现的。一些构建将更快,但其他构建将不会(当缓存必须被清除时)更快(但从不慢;-)。更多信息为什么经常发生here)。

  • 由于符号运行dsymutil,调试版本需要更长的时间,因为它最终变大,上传到设备的时间更长。

  • 默认情况下,发布版本(您可以将其关闭),执行程序集的IL条带。这只需要一点时间 - 在向设备部署(较小的.app)时可能会获得回报。

模拟器技巧

  • 如前所述,尽量避免链接,因为它需要更多时间,并且需要复制程序集(而不是对它们进行符号化处理);

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

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

答案 1 :(得分:4)

这并不是一个真正的答案,而是一个临时的占位符,直到有一个更好的 我找到了this quote by Seb

  

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

     

如果它显示“请勿链接”,那么您将体验非常长版本   时间(dsymutil中的很大一部分)。

我不知道它是否仍然相关,因为当我选择此选项时,MonoDevelop会显示警告信号,而且它似乎不会对性能产生太大影响。

答案 2 :(得分:3)

如果不了解需要执行的所有操作,您不能指望编译器能够快速完成。较大的应用程序自然需要更长时间。不同语言或同一语言的不同编译器可以对编译代码所需的时间产生巨大影响。

我们有一个项目需要将近2分钟的时间来编译。您最好的解决方案是找出一种方法来减少编译代码的次数。

而不是一遍又一遍地尝试修复1行代码并重建。让一群人一起讨论这个问题。或者创建一个包含3或4个要处理的内容的列表,然后完成所有内容然后进行测试。

这些只是一些建议,并不适用于所有情况。