Array.filter 比循环便宜吗?
Posted
技术标签:
【中文标题】Array.filter 比循环便宜吗?【英文标题】:Is Array.filter cheaper than loop? 【发布时间】:2016-03-31 16:42:13 【问题描述】:Array
中有一个 filter
函数。我想知道它比使用通常的loop
便宜,比如for
。
如果是,为什么?
【问题讨论】:
只有基准测试才能回答这个问题。 【参考方案1】:现在 Swift 是开源的,很酷的事情是我们可以自己验证这一点。 Here's the current source code for Sequence.filter
(注意它已经使用了新名称Sequence
和Iterator
;SequenceType
和GeneratorType
将在Swift 3中重命名):
/// Returns an `Array` containing the elements of `self`,
/// in order, that satisfy the predicate `includeElement`.
@warn_unused_result
public func filter(
@noescape includeElement: (Iterator.Element) throws -> Bool
) rethrows -> [Iterator.Element]
var result = ContiguousArray<Iterator.Element>()
var iterator = self.makeIterator()
while let element = iterator.next()
if try includeElement(element)
result.append(element)
return Array(result)
它使用while
循环而不是for
循环,可能是因为该代码是在for ... in
甚至是一件事之前编写的(不过我还没有验证)。但是你可以看到它本质上是一个没有特殊优化的简单循环。
【讨论】:
【参考方案2】:简单地说,它是一个循环,它真的只是让你的代码更干净的语法糖
let stuff = ["asdf", "asdf", ""]
var things: [String] = []
for item in stuff
if(!item.isEmpty)
things.append(item)
在功能上等同于:
let stuff = ["asdf", "asdf", ""]
var things = stuff.filter!$0.isEmpty
6 行减至 1。
由于类型安全性和可预测性,可能会进行一些编译器优化,但根据此:根据您的实现,您的性能可能会有所不同:
enter link description here
【讨论】:
你的意思是for item in stuff
和if !item.isEmpty
哎呀......当你不能使用重构时会发生这种情况:)
还是错了。您需要检查项目是否为空
谢谢!当我用谷歌搜索它时,我找不到链接。太棒了。
另外 isEmpty 是一个属性而不是一个方法以上是关于Array.filter 比循环便宜吗?的主要内容,如果未能解决你的问题,请参考以下文章
Array.forEach Array.map Array.filter的用法