Scala mutable.array.drop的速度惊人地慢

Scala mutable.array.drop的速度惊人地慢,scala,profiling,yourkit,Scala,Profiling,Yourkit,我是Scala的新手,当我试图用YourKit评测我的Scala代码时,我对array.drop的用法有了一些令人惊讶的发现 以下是我写的: ... val items = s.split(" +") // s is a string ... val s1 = items.drop(2).mkString(" ") ... 在我的代码运行了1分钟后,YourKit告诉我函数调用items.drop(2)大约占总执行时间的11% Lexer.scala:33 scala.collection

我是
Scala
的新手,当我试图用
YourKit
评测我的
Scala
代码时,我对
array.drop的用法有了一些令人惊讶的发现

以下是我写的:

...
val items = s.split(" +")   // s is a string
...
val s1 = items.drop(2).mkString(" ")
...
在我的代码运行了1分钟后,YourKit告诉我函数调用
items.drop(2)
大约占总执行时间的11%

Lexer.scala:33 scala.collection.mutable.ArrayOps$ofRef.drop(int) 1054 11%
这真的让我很惊讶,是否有任何内存拷贝会减慢处理速度?如果是这样,优化我的简单代码段的最佳实践是什么?多谢各位

这真让我吃惊,有内存拷贝吗 这会减慢处理速度吗

ArrayOps.drop
内部调用
IterableLike.slice
,它分配一个生成器,为每个调用生成一个新的
数组

override def slice(from: Int, until: Int): Repr = {
  val lo    = math.max(from, 0)
  val hi    = math.min(math.max(until, 0), length)
  val elems = math.max(hi - lo, 0)
  val b     = newBuilder
  b.sizeHint(elems)

  var i = lo
  while (i < hi) {
    b += self(i)
    i += 1
  }
  b.result()
}
另一种可能是丰富
Array[T]
以包含您自己版本的
mkString
,该版本手动填充
StringBuilder

object RichOps {
  implicit class RichArray[T](val arr: Array[T]) extends AnyVal {
    def mkStringWithIndex(start: Int, end: Int, separator: String): String = {
      var idx = start
      val stringBuilder = new StringBuilder(end - start)

      while (idx < end) {
        stringBuilder.append(arr(idx))
        if (idx != end - 1) {
          stringBuilder.append(separator)
        }
        idx += 1
      }

      stringBuilder.toString()
    }
  }
}
收益率:

and welcome

split
返回一个
数组
。对于
数组
<代码>删除
必须复制一份。非常感谢您的帮助!我真的很感激@欢迎光临,希望有帮助。确保正确地测试它(如果您决定使用数组的扩展名)。
object Test {
  def main(args: Array[String]): Unit = {
    import RichOps._
    val items = "hello everyone and welcome".split(" ")
    println(items.mkStringWithIndex(2, items.length, " "))
  }
and welcome