Scala 2.10.1和专业化(无法使其正常工作)

时间:2013-03-11 13:48:12

标签: performance scala generics boxing scala-2.10

很抱歉第二次询问专业化问题,但我还不太了解到底发生了什么...... 所以,我有一个项目(带有AI的Gomoku游戏),我决定在它的热门部分使用我自己的简单和脏的@specialized ad-hoc集合,因为我必须存储没有装箱的原始类型。问题是这并没有真正帮助,因为在jvisualvm的采样器中我清楚地看到了

scala.runtime.BoxesRunTime.boxToShort()

当最佳移动搜索开始运行时,吃掉数千 ms。

项目:https://github.com/magicgoose/Gomoku
具有较差“集合”的文件:https://github.com/magicgoose/Gomoku/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),试图完成类似的事情(没有原始拳击的数据集合),但我真的不明白它是如何完成的。

1 个答案:

答案 0 :(得分:4)

这有一个简单的答案:Function1并非专门针对Short个参数,只有IntLongFloatDouble 。因此,当您致电fun时,您需要在途中打电话。

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