【问题标题】:Scala 2.10.1 and specialization (can't get it working right)Scala 2.10.1 和专业化(无法正常工作)
【发布时间】:2013-03-11 13:48:11
【问题描述】:

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

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),它试图完成类似的事情(没有原始装箱的数据收集),但我不太明白它是如何完成的。

【问题讨论】:

    标签: performance scala generics boxing scala-2.10


    【解决方案1】:

    这有一个简单的答案:Function1 不专门处理 Short 参数,仅处理 IntLongFloatDouble。因此,当您致电fun 时,您需要在进入的过程中装箱。

    要么使用你自己的函数类——遗憾的是缺少方便的简写!——或者确保你没有使用Short =&gt; Boolean,而是使用Int =&gt; Boolean(类型知道它)。请注意,当我说这很容易时,我的意思只是很容易解释问题:这两种解决方案都不是那么容易实现,但目前这是必要的。

    【讨论】:

    • 糟糕。这太奇怪了。顺便说一句,我可以摆脱 Short 并在任何地方使用 Int 并将 2 Ints 打包到 Int 而不是将 2 Bytes 打包到 Short,这很脏,但对于这个特定的应用程序来说还可以,因为值的范围无论如何都是有限的。现在我试试看有没有改进。
    • 我已经切换到 Ints,现在没有拳击了。
    猜你喜欢
    • 2014-03-23
    • 2020-10-22
    • 2013-04-24
    • 2023-03-22
    • 2018-09-08
    • 1970-01-01
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多