3

IntフィールドとDoubleフィールドがほとんどないクラスがあります。あるオブジェクトから別のオブジェクトにすべてのデータをコピーするための最速の方法は何ですか?

class IntFields {
  private val data : Array[Int] = Array(0,0)

  def first : Int = data(0)
  def first_= (value: Int) = data(0) = value
  def second : Int = data(1)
  def second_= (value : Int) = data(1) = value

  def copyFrom(another : IntFields) =
    Array.copy(another.data,0,data,0,2)
}

これが私が提案する方法です。しかし、私はscalaの内部を明確に理解していないので、それが本当に効果的であるとは思えません。

update1:

実際、私はscalaに相当するc++memcpyを探しています。単純なオブジェクトを1つ取り、その内容をバイトごとにコピーする必要があります。

配列のコピーは単なるハックです。私は通常のscalaでサポートされている方法をグーグルで検索しましたが、何も見つかりませんでした。

update2:

私は2つのホルダーをマイクロベンチマークしようとしました。12個の変数を持つ単純なケースクラスと、配列でバックアップされた1つです。すべてのベンチマーク(コレクションに対する単純なコピーと複雑な計算)では、アレイベースのソリューションの動作が約7%遅くなります。

したがって、memcpyをシミュレートするための他の手段が必要です。

4

1 に答える 1

1

に使用される両方の配列Array.copyはプリミティブ整数の配列であるため (つまり、ボックス化された整数を保持するケースではありません。この場合while、要素をコピーするためにボックス化/ボックス化解除のループが使用されます)。ジャバSystem.arraycopyです。whileつまり、これが巨大な配列である場合、要素をコピーするループと比較してパフォーマンスの違いが見られるでしょう。配列には 2 つの要素しかないため、次のようにする方がおそらく効率的です。

def copyFrom(another: IntFields) {
  data(0) = another.data(0)
  data(1) = another.data(1)
}

編集:

最も速いのは、フィールドを 1 つずつコピーすることだと思います。パフォーマンスが本当に重要な場合は、使用を検討する必要があります-小さなブロックにUnsafe.getInt使用するよりも高速であるとの報告もあります: https://stackoverflow.com/questions/5574241/interesting-uses-of-sun-misc-unsafeSystem.arraycopy

于 2012-09-29T17:38:54.433 に答える