2013-03-11 18 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