2013-03-11 49 views
0

对不起第二次问专业化,但我还没有很好的了解到底是怎么回事...
所以,我有一个项目(与AI的Gomoku游戏),并且我决定在它的热门部分使用我自己的简单和脏的@specialized ad-hoc集合,因为我必须在没有装箱的情况下存储原始类型。问题是,这并不能真正帮助,因为在jvisualvm的采样我清楚地看到斯卡拉2.10.1和专业化(不能得到它的工作权利)

scala.runtime.BoxesRunTime.boxToShort() 

吃起来毫秒十万最佳移动搜索开始运行时。

项目: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),它试图完成类似的事情(没有原始装箱的数据收集),但我并不真正了解它是如何完成的。

回答

4

这有一个简单的答案:Function1不是专门Short参数,只IntLongFloatDouble。所以,当你调用fun你需要在路上框

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

+0

糟糕。这太奇怪了。顺便说一句,我可以摆脱短和使用Int到处,并包装2 Ints到INT而不是包装2字节到短,这是肮脏的,但确定这个特定的应用程序,因为估值的范围无论如何有限。现在我会尝试一下,看看是否会有改进。 – 2013-03-11 14:27:52

+0

我已经切换到Ints,现在没有拳击。 – 2013-03-11 15:11:28