scala中for-comprehension的表现

Piy*_*ush 10 performance scala for-comprehension

我有一个关于scala中for-comprehension效率的问题.

当perm是大约550个元素的列表时,以下代码大约需要45秒

perm = some list
for{
   perm <- perms.withFilter(_.size > 0)
   wordList = somefunction(perm) //expensive operation, wordlist is a list of strings
   sentenceList = somefunction1(perm) //very expensive operation, sentenceList is a list of list of strings
   word <- wordList
   sentence <- sentenceList
} yield { word::sentence}
Run Code Online (Sandbox Code Playgroud)

当我将以下代码更改为以下代码时,它使用相同的烫发列表在3秒内运行

perm = some list
for{
   perm <- perms.withFilter(_.size > 0)
   word <- somefunction(perm) //expensive operation
   sentence <- somefunction1(perm) //very expensive operation
} yield { word::sentence}
Run Code Online (Sandbox Code Playgroud)

性能的差异是否与Scala中的延迟评估有关?

dre*_*xin 11

让我们去理解这两种理解:

1.)

perms.withFilter(_.size > 0).flatMap { perm =>
  val wordList = somefunction(perm) //expensive operation
  val sentenceList = somefunction1(perm) //very expensive operation
  wordList.flatMap { word =>
    sentenceList.map { sentence =>
      word::sentence
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

2.)

perms.withFilter(_.size > 0).flatMap { perm =>
  somefunction(perm).flatMap { word =>
    somefunction1(perm).map { sentence =>
      word :: sentence
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,每次都会执行两种昂贵的功能.在第二种情况下,当somefunction(perm)返回空结果时,somefunction1(perm)将永远不会执行.