Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala流性能_Scala_Functional Programming_Lazy Evaluation - Fatal编程技术网

Scala流性能

Scala流性能,scala,functional-programming,lazy-evaluation,Scala,Functional Programming,Lazy Evaluation,递归代数数据类型和惰性评估有用性的一个典型例子是博弈算法,如John Hughes的著名WhyFP论文(Comp.J.,Vol.32,No.2,1989)所示 使用Scala实现它,并对游戏的每个子树使用惰性评估的Stream[Tree[A]],将得到trait Tree[A],定义如下: sealed trait Tree[A] case class Branch[A](ts: Stream[Tree[A]]) extends Tree[A] case class Leaf[A](a: A)

递归代数数据类型和惰性评估有用性的一个典型例子是博弈算法,如John Hughes的著名WhyFP论文(Comp.J.,Vol.32,No.2,1989)所示

使用Scala实现它,并对游戏的每个子树使用惰性评估的
Stream[Tree[A]]
,将得到
trait Tree[A]
,定义如下:

sealed trait Tree[A]
case class Branch[A](ts: Stream[Tree[A]]) extends Tree[A]
case class Leaf[A](a: A) extends Tree[A]
现在,一个延迟评估的(可能是无限的)游戏可以表示为:

gameTree(b: Board): Tree[Board] = 
  if (b.isAtEndPos) Leaf(b) 
  else Branch(b.emptySlots.toStream.map((pos: Int) => gameTree(b addTic pos)))
您还可以对 实际算法,例如执行此任务的minimax,以及 评估树中必要的部分:

def maximize(tree: Tree[Board]): Int = tree match {
  case Leaf(board) => board.score
  case Branch(subgames) => 
     subgames.map((tree: Tree[Board]) => minimize(tree)).max
} ...
def minimize // symmetrically 
但是,无限流带来了显著的性能损失,使用渴望列表(
ts:list[tree[a]]
)求解相同的游戏树的效率提高了25倍

在类似的情况下,有没有办法在Scala中有效地使用流或惰性结构

编辑:添加了一些性能结果和实际代码: 这是懒惰的版本

惰性版本(scala 2.9.1):
创建游戏树的时间:0.031s,找到解决方案的时间为133.216s。

树创建中没有转换,即在极小极大中映射到集合
创建游戏树的时间:4.791s,找到解决方案的时间为6.088s。

在游戏树创建中转换为列表
创建游戏树的时间:4.438秒,查找解决方案的时间为5.601秒。

如果您想快速大致了解时间,可以尝试运行:

JAVA_OPTS="-Xprof" scala TicTacToe

如评论中所述,我个人无法复制您的经验。

“效率是原来的25倍”--是否愿意发布一个包含变体和基准测试工具的项目?无法在我的机器上复制。对于创建/解决方案,我得到:
Stream
s:0.024s/6.568s,
List
s:4.189s/5.382s。所以
Stream
s对我来说更快(当你把两次加起来时);流:0.23s/6.12s与列表:4.07s/5.16s。因此,在这种情况下,似乎流实际上表现得更好。我也在使用scala 2.9.1,所以我能想到的唯一区别是不同的JVM,不同的JVM设置,或者一些奇怪的硬件相关问题。我还没有指出实际的问题,但是运行性能测试,这个问题很草率,因为在不同的干净安装环境中,而合理的gc选项集,我并没有在streams性能方面绊倒。大约一年前,我确实遇到过类似的问题(在一个不同的环境中,hw),一个简单的实现是折叠一个流而不是一个范围(尽管连续传递显然是最慢的)。因此,我没有怀疑,环境污染将是根本原因。很抱歉。谢谢大家的努力@链接已断开