Performance 为什么映射实现应该覆盖foreach?
forPerformance 为什么映射实现应该覆盖foreach?,performance,algorithm,scala,map,Performance,Algorithm,Scala,Map,forscala.collection.mutable.Map的 为了提高效率,重写方法foreach和size 覆盖size是(可能)一个O(n)到O(1)的改进 但是重写foreach的值是什么呢?我想这是因为您处理的是一个可变映射。如果在多个进程之间共享的可变集合上进行多次迭代,则可能会出现非常严重的问题。例如,如果元素被删除,但没有在迭代器中遍历,那么会怎样?foreach方法(from)的默认实现不使用任何类型的并发处理 相同的注释不会出现在不可变的版本中。我想这是因为您正在处理一个可
scala.collection.mutable.Map的
为了提高效率,重写方法foreach
和size
覆盖size
是(可能)一个O(n)
到O(1)
的改进
但是重写foreach的值是什么呢?我想这是因为您处理的是一个可变映射。如果在多个进程之间共享的可变集合上进行多次迭代,则可能会出现非常严重的问题。例如,如果元素被删除,但没有在迭代器中遍历,那么会怎样?foreach
方法(from)的默认实现不使用任何类型的并发处理
相同的注释不会出现在不可变的版本中。我想这是因为您正在处理一个可变的映射。如果在多个进程之间共享的可变集合上进行多次迭代,则可能会出现非常严重的问题。例如,如果元素被删除,但没有在迭代器中遍历,那么会怎样?foreach
方法(from)的默认实现不使用任何类型的并发处理
不变版本中不会出现相同的注释。scala.collection.immutable.MapLike中foreach的默认实现使用迭代器实现foreach。此实现继承自
但是实现迭代器通常比实现foreach复杂得多。迭代器必须显式地跟踪当前位置,这需要状态,并且在树状结构的情况下可能需要大量逻辑,例如,不可变哈希映射所使用的内容。以下是当前集合库中不可变哈希映射和哈希集的迭代器示例。不是很简单,对吧
另一方面,foreach方法使用调用堆栈跟踪当前位置,因此实现起来非常简单高效。二叉树的foreach方法就在这里;对。foreach(f)
因此,根据映射的迭代器的复杂程度,单独实现foreach以提高性能确实是个好主意。scala.collection.immutable.MapLike中foreach的默认实现使用迭代器实现foreach。此实现继承自
但是实现迭代器通常比实现foreach复杂得多。迭代器必须显式地跟踪当前位置,这需要状态,并且在树状结构的情况下可能需要大量逻辑,例如,不可变哈希映射所使用的内容。以下是当前集合库中不可变哈希映射和哈希集的迭代器示例。不是很简单,对吧
另一方面,foreach方法使用调用堆栈跟踪当前位置,因此实现起来非常简单高效。二叉树的foreach方法就在这里;对。foreach(f)
因此,根据map的迭代器的复杂程度,单独实现foreach以提高性能确实是一个好主意。map
可以保证线程安全性。通常在Java/Scala中,除非另有声明,否则事情都不是线程安全的,这样就不会招致同步惩罚。Map
可以保证线程安全性。通常在Java/Scala中,除非另有声明,否则事情都不是线程安全的,这样就不会招致同步惩罚。但有趣的是,的文档中没有这样的建议。也许他们不希望有那么多人扩展immutable.Map?为性能重写foreach当然也是不可变映射的一个好主意,HashMap显然做到了这一点。有趣的是,的文档中没有这样的建议。也许他们不希望有那么多人扩展immutable.Map?为性能重写foreach当然也是不可变映射的一个好主意,而HashMap显然做到了这一点。
def foreach[U](f: A => U): Unit =
iterator.foreach(f)