编译 – 为什么Swift的编译时间这么慢?

我使用Xcode 6 Beta 6。

这是一个问题,我已经错过了一段时间,但它达到了一个点,现在勉强可用。

我的项目开始有一个体面的大小65 Swift文件和一些桥接的Objective-C文件(这真的不是问题的原因)。

它似乎像对任何Swift文件的任何轻微的修改(如在类中添加一个简单的空白,在应用程序中几乎不使用)将导致重新编译指定的目标的整个Swift文件。

经过深入调查,我发现编译器时间的几乎100%是CompileSwift阶段,其中Xcode在目标的所有Swift文件上运行swiftc命令。

我做了一些进一步的调查,如果我只保留应用程序委托与一个默认控制器编译是非常快,但随着我添加越来越多的我的项目文件,编译时间开始变得非常慢。

现在只有65个源文件,每次编译大约需要8/10秒。不是很迅速。

我没有看到任何帖子谈论这个问题,除了this one,但它是一个旧版本的Xcode 6.所以我想知道如果我是唯一的那种情况下。

更新

我已经检查了一些像AlamofireEulerCryptoSwiftGitHub的Swift项目,但没有一个有足够的Swift文件来进行比较。唯一的项目我发现,开始一个体面的大小是SwiftHN,即使它只有十几个源文件,我仍然能够验证同样的事情,一个简单的空间和整个项目需要重新编译,开始采取少时间(2/3秒)。

相比Objective-C代码,分析器和编译都很快,这真的感觉像Swift将永远不能处理大项目,但请告诉我错了。

更新与Xcode 6 Beta 7

仍然没有任何改善。这开始变得可笑。由于缺少#import在Swift,我真的不知道苹果将如何能够优化这。

更新与Xcode 6.3和Swift 1.2

苹果已经添加了incremental builds(和许多其他编译器优化)。您必须将代码迁移到Swift 1.2才能看到这些好处,但是Apple在Xcode 6.3中添加了一个工具来帮助您:

然而

不要像我那样快乐。它们用来使构建增量的图解算器还没有很好地优化。

首先,它不会看到函数签名的变化,所以如果你在一个方法的块中添加一个空格,所有依赖于该类的文件将被重新编译。

第二,似乎基于重新编译的文件创建树,即使更改不影响它们。例如,如果将这三个类移动到不同的文件中

class FileA: NSObject {
    var foo:String?
}
class FileB: NSObject {
    var bar:FileA?
}
class FileC: NSObject {
    var baz:FileB?
}

现在如果你修改FileA,编译器显然会标记FileA被重新编译。它还将重新编译FileB(根据对FileA的更改,这将是OK),但也是FileC,因为FileB被重新编译,这是相当糟糕,因为FileC从不使用FileA在这里。

所以我希望他们改进依赖树解算器…我已经打开一个radar与这个示例代码。

更新与Xcode 7 beta 5和Swift 2.0

昨天苹果发布了beta 5和内部的发行说明,我们可以看到:

Swift Language & Compiler
• Incremental builds: changing just the body of a function should no longer cause dependent files to be rebuilt. (15352929)

我已经试过,我必须说,它是真的(真的!)现在好了。他们大大优化了swift中的增量构建。

我强烈建议你创建一个swift2.0分支,并保持你的代码更新使用XCode 7 beta 5.你会很高兴的编译器的增强(但我会说,XCode 7的全局状态仍然很慢&婴儿车)

更新与Xcode 8.2

这是已经有一段时间,因为我上次更新这个问题,所以这里是。

我们的应用程序现在约20k行几乎完全Swift代码,这是体面,但不突出。它进行了swift 2和swift 3迁移。它需要大约5 / 6m编译在2014年中期Macbook pro(2.5 GHz Intel Core i7),这是一个干净的构建是好的。

然而,增量构建仍然是一个笑话,尽管苹果声称:

Xcode will not rebuild an entire target when only small changes have occurred. (28892475)

显然,我认为我们很多人只是笑了,检查出这个废话(添加一个私人(私人!)属性到我的项目的任何文件将重新编译整个事情…)

我想指出你们this thread在苹果开发者论坛,它有一些更多的信息关于这个问题(以及赞赏苹果开发沟通一段时间)

基本上人们已经想出了一些东西来尝试改进增量构建:

>将HEADER_MAP_USES_VFS项目设置添加为true
>禁用从您的方案中查找隐式依赖项
>创建一个新项目并将您的文件层次结构移动到新的项目。

我会尝试解决方案3,但解决方案1/2没有为我们工作。

在这个整体情况下,讽刺的滑稽是,看看第一篇关于这个问题,我们使用Xcode 6,我相信swift 1或swift 1.1代码,当我们达到第一个编译迟缓,现在大约两年后,尽管实际改进从苹果情况与Xcode 6一样糟糕。多讽刺。

我真的很遗憾选择Swift over Obj / C为我们的项目,因为它涉及每天的沮丧。 (我甚至切换到AppCode,但这是另一个故事)

无论如何,我看到这篇文章有32k的意见和143 ups的写作,所以我想我不是唯一的。挂在那里的家伙尽管对这种情况悲观,可能有一些光在隧道尽头。

如果你有时间(和勇气!)我猜苹果欢迎雷达。

下一次!干杯

好吧,事实证明,Rob Napier是对的。它是一个单个文件(实际上是一种方法),导致编译器去berzek。

现在不要误会我。 Swift每次都会重新编译所有文件,但是现在的伟大之处在于,Apple对其编译的文件添加了实时编译反馈,因此Xcode 6 GM现在可以显示正在编译的Swift文件以及实时编译的状态你可以看到在这个屏幕截图:

所以这很方便地知道你的文件是这么长时间。在我的case是这段代码:

var dic = super.json().mutableCopy() as NSMutableDictionary
dic.addEntriesFromDictionary([
        "url" : self.url?.absoluteString ?? "","title" : self.title ?? ""
        ])

return dic.copy() as NSDictionary

因为属性标题的类型是var title:String?而不是NSString。编译器在将其添加到NSMutableDictionary时会疯狂。

将其更改为:

var dic = super.json().mutableCopy() as NSMutableDictionary
dic.addEntriesFromDictionary([
        "url" : self.url?.absoluteString ?? "","title" : NSString(string: self.title ?? "")
        ])

return dic.copy() as NSDictionary

使编译从10/15秒(也许更多)下降到一秒钟…惊人。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘贴.待开发的功能:1.支持自动生成约束2.开发设置页面3.做一个浏览器插件,支持不需要下载整个工程,可即时操作当前蓝湖浏览页面4.支持Flutter语言模板生成5.支持更多平台,如Sketch等6.支持用户自定义语言模板
现实生活中,我们听到的声音都是时间连续的,我们称为这种信号叫模拟信号。模拟信号需要进行数字化以后才能在计算机中使用。目前我们在计算机上进行音频播放都需要依赖于音频文件。那么音频文件如何生成的呢?音频文件的生成过程是将声音信息采样、量化和编码产生的数字信号的过程,我们人耳所能听到的声音频率范围为(20Hz~20KHz),因此音频文件格式的最大带宽是20KHZ。根据奈奎斯特的理论,音频文件的采样率一般在40~50KHZ之间。奈奎斯特采样定律,又称香农采样定律。...............
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿遍又亿遍,久久不能离开!看着小仙紫姐姐的蹦迪视频,除了一键三连还能做什么?突发奇想,能不能把舞蹈视频转成代码舞呢?说干就干,今天就手把手教大家如何把跳舞视频转成代码舞,跟着仙女姐姐一起蹦起来~视频来源:【紫颜】见过仙女蹦迪吗 【千盏】一、核心功能设计总体来说,我们需要分为以下几步完成:从B站上把小姐姐的视频下载下来对视频进行截取GIF,把截取的GIF通过ASCII Animator进行ASCII字符转换把转换的字符gif根据每
【Android App】实战项目之仿抖音的短视频分享App(附源码和演示视频 超详细必看)
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至2022年4月底。我已经将这篇博客的内容写为论文,上传至arxiv:https://arxiv.org/pdf/2204.10160.pdf欢迎大家指出我论文中的问题,特别是语法与用词问题在github上,我也上传了完整的项目:https://github.com/Whiffe/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset关于自定义ava数据集,也是后台
因为我既对接过session、cookie,也对接过JWT,今年因为工作需要也对接了gtoken的2个版本,对这方面的理解还算深入。尤其是看到官方文档评论区又小伙伴表示看不懂,所以做了这期视频内容出来:视频在这里:本期内容对应B站的开源视频因为涉及的知识点比较多,视频内容比较长。如果你觉得看视频浪费时间,可以直接阅读源码:goframe v2版本集成gtokengoframe v1版本集成gtokengoframe v2版本集成jwtgoframe v2版本session登录官方调用示例文档jwt和sess
【Android App】实战项目之仿微信的私信和群聊App(附源码和演示视频 超详细必看)
用Android Studio的VideoView组件实现简单的本地视频播放器。本文将讲解如何使用Android视频播放器VideoView组件来播放本地视频和网络视频,实现起来还是比较简单的。VideoView组件的作用与ImageView类似,只是ImageView用于显示图片,VideoView用于播放视频。...
采用MATLAB对正弦信号,语音信号进行生成、采样和内插恢复,利用MATLAB工具箱对混杂噪声的音频信号进行滤波
随着移动互联网、云端存储等技术的快速发展,包含丰富信息的音频数据呈现几何级速率增长。这些海量数据在为人工分析带来困难的同时,也为音频认知、创新学习研究提供了数据基础。在本节中,我们通过构建生成模型来生成音频序列文件,从而进一步加深对序列数据处理问题的了解。
基于yolov5+deepsort+slowfast算法的视频实时行为检测。1. yolov5实现目标检测,确定目标坐标 2. deepsort实现目标跟踪,持续标注目标坐标 3. slowfast实现动作识别,并给出置信率 4. 用框持续框住目标,并将动作类别以及置信度显示在框上
数字电子钟设计本文主要完成数字电子钟的以下功能1、计时功能(24小时)2、秒表功能(一个按键实现开始暂停,另一个按键实现清零功能)3、闹钟功能(设置闹钟以及到时响10秒)4、校时功能5、其他功能(清零、加速、星期、八位数码管显示等)前排提示:前面几篇文章介绍过的内容就不详细介绍了,可以看我专栏的前几篇文章。PS.工程文件放在最后面总体设计本次设计主要是在前一篇文章 数字电子钟基本功能的实现 的基础上改编而成的,主要结构不变,分频器将50MHz分为较低的频率备用;dig_select
1.进入官网下载OBS stdioOpen Broadcaster Software | OBS (obsproject.com)2.下载一个插件,拓展OBS的虚拟摄像头功能链接:OBS 虚拟摄像头插件.zip_免费高速下载|百度网盘-分享无限制 (baidu.com)提取码:6656--来自百度网盘超级会员V1的分享**注意**该插件必须下载但OBS的根目录(应该是自动匹配了的)3.打开OBS,选中虚拟摄像头选择启用在底部添加一段视频录制选择下面,进行录制.
Meta公司在9月29日首次推出一款人工智能系统模型:Make-A-Video,可以从给定的文字提示生成短视频。基于**文本到图像生成技术的最新进展**,该技术旨在实现文本到视频的生成,可以仅用几个单词或几行文本生成异想天开、独一无二的视频,将无限的想象力带入生活
音频信号叠加噪声及滤波一、前言二、信号分析及加噪三、滤波去噪四、总结一、前言之前一直对硬件上的内容比较关注,但是可能是因为硬件方面的东西可能真的是比较杂,而且需要渗透的东西太多了,所以学习进展比较缓慢。因为也很少有单纯的硬件学习研究,总是会伴随着各种理论需要硬件做支撑,所以还是想要慢慢接触理论学习。但是之前总找不到切入点,不知道从哪里开始,就一直拖着。最近稍微接触了一点信号处理,就用这个当作切入点,开始接触理论学习。二、信号分析及加噪信号处理选用了matlab做工具,选了一个最简单的语音信号处理方
腾讯云 TRTC 实时音视频服务体验,从认识 TRTC 到 TRTC 的开发实践,Demo 演示& IM 服务搭建。
音乐音频分类技术能够基于音乐内容为音乐添加类别标签,在音乐资源的高效组织、检索和推荐等相关方面的研究和应用具有重要意义。传统的音乐分类方法大量使用了人工设计的声学特征,特征的设计需要音乐领域的知识,不同分类任务的特征往往并不通用。深度学习的出现给更好地解决音乐分类问题提供了新的思路,本文对基于深度学习的音乐音频分类方法进行了研究。首先将音乐的音频信号转换成声谱作为统一表示,避免了手工选取特征存在的问题,然后基于一维卷积构建了一种音乐分类模型。
C++知识精讲16 | 井字棋游戏(配资源+视频)【赋源码,双人对战】
本文主要讲解如何在Java中,使用FFmpeg进行视频的帧读取,并最终合并成Gif动态图。
在本篇博文中,我们谈及了 Swift 中 some、any 关键字以及主关联类型(primary associated types)的前世今生,并由浅及深用简明的示例向大家讲解了它们之间的奥秘玄机。