- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个开源项目,项目中的文件数超过 40。
我在配置为Debug
并且编译时间为2m22s
时构建项目。我也用 BuildTimeAnalyzer ,最长的时间是28ms
。
但是当我使用Release
配置构建项目时,它在Compile Swift source files
中停留了一个多小时。
我对此一无所知,请帮助我。
最佳答案
在 DEBUG 版本中,如果你把花在每个函数上的所有时间加起来,你会得到大约 7 秒。这些数字并没有完全相加——你已经花了 142 秒来构建整个东西,但这些函数只需要不到 7 秒的时间来编译??
那是因为这些时间只考虑了对每个函数体的类型检查。在Swift frontend您可以使用三个标志:
-Xfrontend -debug-time-compilation
-Xfrontend -debug-time-function-bodies
-Xfrontend -debug-time-expression-type-checking
先用第一个看全貌。选择一个慢文件,说 Option.swift
,然后看:
===-------------------------------------------------------------------------===
Swift compilation
===-------------------------------------------------------------------------===
Total Execution Time: 30.5169 seconds (43.6413 wall clock)
---User Time--- --System Time-- --User+System-- ---Wall Time--- --- Name ---
23.5183 ( 80.1%) 0.7773 ( 67.6%) 24.2957 ( 79.6%) 34.4762 ( 79.0%) LLVM output
3.7312 ( 12.7%) 0.0437 ( 3.8%) 3.7749 ( 12.4%) 5.4192 ( 12.4%) LLVM optimization
1.8563 ( 6.3%) 0.2830 ( 24.6%) 2.1393 ( 7.0%) 3.1800 ( 7.3%) IRGen
0.2026 ( 0.7%) 0.0376 ( 3.3%) 0.2402 ( 0.8%) 0.4666 ( 1.1%) Type checking / Semantic analysis
... <snip> ...
29.3665 (100.0%) 1.1504 (100.0%) 30.5169 (100.0%) 43.6413 (100.0%) Total
事实证明,慢的不是 Swift,而是 LLVM!所以看类型检查时间是没有意义的。我们可以使用 -Xllvm -time-passes
进一步检查为什么 LLVM 很慢,但它不会给我们有用的信息,它只是说 X86 Assembly/Object Emitter
is taking大多数时间。
让我们退后一步,检查哪些文件编译时间最长:
Option.swift 30.5169
Toolbox.swift 15.6143
PictorialBarSerie.swift 12.2670
LineSerie.swift 8.9690
ScatterSerie.swift 8.5959
FunnelSerie.swift 8.3299
GaugeSerie.swift 8.2945
...
Options.swift
花费半分钟。这个文件有什么问题?
第一个问题很容易解决:改用final class
!第二个问题不会有一个简单的解决方法(我没有看到替代方案有任何时间改进例如,用类层次结构替换枚举)。所有其他慢文件都有类似的问题:大结构,大枚举。
只需将所有 struct
替换为 final class
就足以将编译时间从“超过几个小时仍在编译”缩短为“2.5 分钟”。
另见 Why Choose Struct Over Class? .您的“结构”可能不符合结构
的条件。
请注意,从 struct
更改为类确实会改变用户代码的语义,因为类具有引用语义。
关于配置为 'release' 时 Swift 构建时间太长?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43455325/
在我们的服务出现一些预期的增长之后,突然间一些更新花费了非常长的时间,这些过去非常快,直到表达到大约 2MM 记录,现在它们每个需要大约 40-60 秒。 update table1 set fiel
我在服务中实现了一个传感器事件监听器,只要采样周期和最大报告延迟低于 1 秒,该监听器就可以正常工作,但一旦我将采样周期增加到超过 1 秒,传感器就根本不会更新。 我希望采样周期为 10 秒(可能是
我使用 Tkinter GUI 来启动测量和分析过程,基本上只需单击一个按钮即可开始。由于这些测量可能需要一段时间,我尝试添加一个进度条,即这个: http://tkinter.unpythonic.
我正在尝试使用套接字发送数据包,但出现错误。 invalid conversion from ‘omnetpp::cPacket*’ to ‘inet::Packet*’ [-fpermissive]
我刚刚发现 String#split 有以下奇怪的行为: "a\tb c\nd".split => ["a", "b", "c", "d"] "a\tb c\nd".split(' ') => ["a
您好,我正在尝试 ClojureScript,我正在使用 Klipse作为我的 REPL 差不多。这可能不是它的预期用途,但因为我没有做任何太复杂的事情,所以现在没问题。 我遇到的一个问题是尝试设置计
根据下面的数据,ClockKit 会生成一次 future 的 CLKComplicationTimelineEntry 项,但对于过去的时间点,会进行 24 次调用!这是为什么? 更多详情: 我注意
我有一个 MySQL 表,这个表有一个名为 datetime_utc 的 DATETIME 列。如您所料,它是 UTC 日期和时间。在我的 Bookshelf 模型中,我定义了一个虚拟 getter,
大家好,我是二哥呀! 昨天,一位球友问我能不能给他解释一下 @SpringBootApplication 注解是什么意思,还有 Spring Boot 的运行原理,于是我就带着他扒拉了一下这个注解的源
我是一名优秀的程序员,十分优秀!