很抱歉第二次询问专业化问题,但我还不太了解到底发生了什么......
所以,我有一个项目(带有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),试图完成类似的事情(没有原始拳击的数据集合),但我真的不明白它是如何完成的。
答案 0 :(得分:4)
这有一个简单的答案:Function1
并非专门针对Short
个参数,只有Int
,Long
,Float
和Double
。因此,当您致电fun
时,您需要在途中打电话。
使用你自己的函数类 - 遗憾的是缺少方便的速记! - 或者确保你没有使用Short => Boolean
而是使用Int => Boolean
(并且类型知道它)。请注意,当我说这很简单时,我的意思很容易解释问题:两种解决方案都不容易实现,但目前这是必要的。