0

很抱歉第二次询问专业化问题,但我还不太了解到底发生了什么......
所以,我有一个项目(带有人工智能的五子棋游戏),我决定使用我自己的简单而肮脏的@在它的热门部分专门的 ad-hoc 集合,因为我必须在没有装箱的情况下存储原始类型。问题是这并没有真正的帮助,因为在jvisualvm's Sampler 我清楚地看到

scala.runtime.BoxesRunTime.boxToShort()

当最佳移动搜索开始运行时会消耗数千毫秒。

项目:https
://github.com/magicgoose/G ​​omoku “收藏品”较差的文件: https
://github.com/magicgoose/G​​omoku/blob/master/src/magicgoose/gomoku/ai/SpecializedCollections.scala 导致拳击的方法(我认为是其中之一):

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参数,只有IntLongFloatDouble。所以当你打电话时,fun你需要在进去的时候装箱。

要么使用你自己的函数类——遗憾的是缺乏方便的速记!——或者确保你没有使用Short => Boolean,而是使用Int => Boolean(并且类型知道它)。请注意,当我说这很容易时,我的意思只是容易解释问题:这两种解决方案都不是那么容易实现,但目前这是必要的。

于 2013-03-11T14:23:28.927 回答