Performance Scala 2.10.1和专门化(无法正常工作)

Performance Scala 2.10.1和专门化(无法正常工作),performance,scala,generics,boxing,scala-2.10,Performance,Scala,Generics,Boxing,Scala 2.10,很抱歉第二次问你关于专业化的问题,但我还不太了解到底发生了什么… 因此,我有一个项目(带AI的Gomoku游戏),我决定在它的热门部分使用我自己的简单而肮脏的@specialized-hoc集合,因为我必须存储基本类型而不必装箱。问题是这并没有真正的帮助,因为在jvisualvm的采样器中,我清楚地看到 scala.runtime.BoxesRunTime.boxToShort() 当最佳移动搜索开始运行时,消耗数千毫秒 项目: “集合”较差的文件: 导致拳击的方法(我认为是其中之一): tr

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

scala.runtime.BoxesRunTime.boxToShort()
当最佳移动搜索开始运行时,消耗数千毫秒

项目:
“集合”较差的文件:
导致拳击的方法(我认为是其中之一):

trait-Indexed[@specialized T]扩展了可枚举的[T]{
@内联定义长度:Int
@内联def应用(i:Int):T
// ...
@内联最终def findIndex(乐趣:T=>Boolean)={
@tailrec def find(i:Int):Int={
如果(i<长度){
如果我
其他查找(i+1)
}else-1
}
查找(0)
}
}

我看过另一个项目(debox:),它试图完成类似的事情(没有原始装箱的数据收集),但我真的不明白它是如何完成的。

这有一个简单的答案:
Function1
不专门处理
Short
参数,只处理
Int
Long
Float
,和
Double
。因此,当你打电话给
fun
时,你需要在进去的路上打电话


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

这有一个简单的答案:
函数1
不是专门针对
参数的,只有
Int
,和
Double
。因此,当你打电话给
fun
时,你需要在进去的路上打电话


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

Oops。这太奇怪了。顺便说一句,我可以去掉Short,在任何地方都使用Int,并将2个Int打包成Int,而不是将2个字节打包成Short,这是肮脏的,但对于这个特定的应用程序来说还可以,因为值的范围无论如何都是有限的。现在我将尝试一下,看看是否会有改进。我已经切换到Ints,现在没有boxing.Oops。这太奇怪了。顺便说一句,我可以去掉Short,在任何地方都使用Int,并将2个Int打包成Int,而不是将2个字节打包成Short,这是肮脏的,但对于这个特定的应用程序来说还可以,因为值的范围无论如何都是有限的。现在我将尝试一下,看看是否会有改进。我已经切换到Ints,现在没有拳击。
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)
  }
}