Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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
Arrays Scala中Array.map(f:A=>;B)的性能不佳_Arrays_Performance_Scala_Map_For Loop - Fatal编程技术网

Arrays Scala中Array.map(f:A=>;B)的性能不佳

Arrays Scala中Array.map(f:A=>;B)的性能不佳,arrays,performance,scala,map,for-loop,Arrays,Performance,Scala,Map,For Loop,请有人向我解释一下,为什么Array.map(f:A=>B)方法的实现速度比下面的代码慢5倍以上: val list = Array(1, 2, 3, 4, 5, 6, 7, 8, 9) val newList = new Array[Int](size) var j = 0 while (j < size) { newList(j) = list(j) j += 1 } val list=Array(1,2,3,4,5,6,7,8,9) val newList=新数组[I

请有人向我解释一下,为什么Array.map(f:A=>B)方法的实现速度比下面的代码慢5倍以上:

val list = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)
val newList = new Array[Int](size)

var j = 0  
while (j < size) {
  newList(j) = list(j)
  j += 1
}
val list=Array(1,2,3,4,5,6,7,8,9)
val newList=新数组[Int](大小)
var j=0
而(j
数组类中的方法映射(f:A=>B)由TraversableLike trait提供,它使用Scala“for loop”迭代输入数组对象的元素,这当然比使用“while loop”慢得多

Scala版本:2.9.2
Java:jdk1.6.02364位windows是一种通用操作(但尚未专门化)。因此,您必须在进出函数的过程中装箱/取消装箱操作。毫不奇怪,速度要慢得多。这是罪魁祸首,而不是所使用的循环样式

这样做的原因是为了代码的一致性和易于维护。由于有无限多的人在处理代码,每种方法都是手工制作的,以获得最佳速度,同时仍然是通用的。通用实用程序比速度更受欢迎,因为您总是可以通过手工编写while循环来恢复速度,但是如果它不是通用的,并且您需要它,那么您就被卡住了


通过对原始集合的操作来提高Scala的性能是一个目标,但可能不是Scala团队的最高目标。现在,如果您需要速度,请使用while循环。

那么您要说的是,上面的代码比
val newList=list.map(x=>x)
快。您可以试试:我想看看您是如何测量的。您是否使用了卡钳这样的微基准框架?map over Array将构建ArraySeq,然后将结果复制到新的阵列上。尽管要优化阵列上的操作应该是第一件事,因为性能是使用阵列的唯一原因(或者说是大小限制)。@ziggystar-或者Java interoperability.谢谢。有道理。包括map、filter、reduce方法在内的漂亮的集合API是主要特性之一,它首先吸引了我对Scala的兴趣。然而,自从我开始在贝叶斯网络中研究一些高度计算密集型的推理算法以来,我基本上是在重写类似函数的代码,使其更具命令性。@user1763278-无论您使用函数式还是命令式样式都是一个不同的问题-这也可能是一个性能增益(除了泛型与原始操作之外). 但无论哪种方式,重构计算中计算密集度最高的部分,使其不那么像惯用的Scala,而更像注重性能的Java,这是我经常做的事情。请记住,您只需要对算法的核心进行这种处理——程序的其余部分可以充分利用好的集合,等等。。