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(注意它已经使用了新名称SequenceIteratorSequenceTypeGeneratorType将在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的用法

如何实现JavaScript的Map和Filter函数?

有啥方法可以比 for 循环更快地遍历数组吗?

javascript(ES6):比“for循环”更有效的方法吗?

数组去重

使用 System.arraycopy(...) 比使用 for 循环复制数组更好吗?