0

スペシャライゼーションについて 2 回目の質問をして申し訳ありませんが、一体何が起こっているのかまだよく理解できていません...
そこで、1 つのプロジェクト (AI を使用した五目並べゲーム) があり、独自のシンプルでダーティな @ を使用することにしました。ボクシングせずにプリミティブ型を保存する必要があるため、そのホットな部分に特化したアドホック コレクション。問題は、これが実際には役に立たないことですjvisualvm

scala.runtime.BoxesRunTime.boxToShort()

最適な移動検索の実行が開始されると、数千ミリ秒が消費されます。

プロジェクト: https://github.com/magicgoose/G​​omoku
貧弱な「コレクション」を含むファイル: https://github.com/magicgoose/G
​​omoku/blob/master/src/magicgoose/gomoku/ai/SpecializedCollections.scala ボクシングを引き起こす方法(そのうちの1つだと思います):

trait Indexed[@specialized T] extends Enumerable[T] {
  @inline def length: Int
  @inline def apply(i: Int): T
// ...
  @inline final def findIndex(fun: T => Boolean) = {
    @tailrec def find(i: Int): Int = {
      if (i < length) {
        if (fun(this(i))) i
        else find(i + 1)
      } else -1
    }
    find(0)
  }
}

私は別のプロジェクト (debox: https://github.com/non/debox ) を見たことがありますが、これは同様のこと (プリミティブ ボクシングを使用しないデータ コレクション) を達成しようとしていますが、そこでどのように行われるのかよくわかりません。

4

1 に答える 1

4

これには簡単な答えFunction1がありShortます。そのため、電話をかけるときは、途中でボックスに入れる必要があります。IntLongFloatDoublefun

Short => Boolean独自の関数クラスを使用するか (悲しいことに、便利な省略形がありません!)、使用していないことを確認してくださいInt => Boolean(型はそれを認識しています)。簡単だと言ったのは、問題を簡単に説明するためだけに言ったことに注意してください。どちらの解決策もそれほど簡単に実装できるわけではありませんが、現時点ではこれが必要です。

于 2013-03-11T14:23:28.927 に答える