7

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
}

TraversableLike trait によって提供される Array クラスのメソッド map(f: A=> B) は、Scala の「for ループ」を使用して、入力 Array オブジェクトの要素を反復処理します。これは、もちろん、「while ループ」を使用するよりもはるかに低速です。 '。

Scala バージョン: 2.9.2 Java: jdk1.6.0_23 64 ビット Windows

4

1 に答える 1

14

map一般的な操作です((まだ)特殊化されていません)。そのため、関数に出入りする途中で操作をボックス化/ボックス化解除する必要があります。当然のことながら、それははるかに遅いです。使用されているループのスタイルではなく、これが原因です。

このようにする理由は、コードの一貫性とメンテナンスの容易さのためです。無数の人々が非常に慎重にコードに取り組んでいるため、各メソッドは汎用的でありながら最適な速度を実現するために手作業で作成されます。while ループを手で書くことでいつでも速度を取り戻すことができるため、一般的なユーティリティは速度よりも好まれてきましたが、それが一般的ではなく、それが必要な場合は行き詰まります。

プリミティブ コレクションの操作で Scala のパフォーマンスを向上させることは目標ですが、おそらく Scala に取り組んでいるチームの最優先目標ではありません。今のところ、速度が必要な場合は while ループを使用してください。

于 2012-10-21T16:34:48.930 に答える