【发布时间】:2018-05-26 07:53:32
【问题描述】:
当我使用高阶函数编写代码时,我发现像这样一次写出一个转换的表达式会更简洁:
let children = objects.map { $0.children }
let validChildren = children.filter { $0.isValid }
let sortedChildren = validChildren.sorted { $0.count < $1.count }
但是,我知道这些函数中的每一个都返回一个新的 Array 对象,我将其存储到一个变量中,所以理论上我每次都创建并保留一个新的 Array 并浪费大量内存。最好将调用写成一行,以便在使用后销毁不必要的数组。
let sortedChildren = objects.map { $0.children } .filter { $0.isValid } .sorted { $0.count < $1.count }
但是这更烦人,因为在一行代码中发生了很多事情。所以我的问题是:Swift 的编译器是否有优化来原谅我的挑剔并在编译时删除未使用的变量?
【问题讨论】:
-
“一行代码中发生了很多事情” – 请注意,您可以在
.filter和.sorted之前换行 ... -
这听起来像是过早的优化。
-
不,编译器不会关心您将其拆分为不同的变量。但是,如果您担心内存问题,您可以按照@MartinR 所说的那样使用换行符,或者您至少可以将变量声明为私有/文件私有或惰性。
-
数组也是“写时复制”,这使得未修改的副本“便宜”。 – 如果您的两个版本之间确实存在差异,您是否进行了分析?
-
@MartinR 当然,但这仍然符合单条指令的条件,并且比第一个选项嘈杂得多。但我的问题主要是关于编译器优化。考虑到它相对年轻,我不确定 swiftc 的可用功能。
标签: swift compiler-optimization