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)
}
}