Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 为什么映射实现应该覆盖foreach?_Performance_Algorithm_Scala_Map - Fatal编程技术网

Performance 为什么映射实现应该覆盖foreach?

Performance 为什么映射实现应该覆盖foreach?,performance,algorithm,scala,map,Performance,Algorithm,Scala,Map,forscala.collection.mutable.Map的 为了提高效率,重写方法foreach和size 覆盖size是(可能)一个O(n)到O(1)的改进 但是重写foreach的值是什么呢?我想这是因为您处理的是一个可变映射。如果在多个进程之间共享的可变集合上进行多次迭代,则可能会出现非常严重的问题。例如,如果元素被删除,但没有在迭代器中遍历,那么会怎样?foreach方法(from)的默认实现不使用任何类型的并发处理 相同的注释不会出现在不可变的版本中。我想这是因为您正在处理一个可

for
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)