【发布时间】:2018-01-11 06:42:27
【问题描述】:
import java.util.concurrent.{Executors, TimeUnit}
import scala.annotation.tailrec
import scala.concurrent.{Await, ExecutionContext, Future}
import scala.util.{Failure, Success}
object Fact extends App {
def time[R](block: => R): Long = {
val t0 = System.nanoTime()
val result = block // call-by-name
val t1 = System.nanoTime()
val t: Long = TimeUnit.SECONDS.convert((t1 - t0), TimeUnit.NANOSECONDS)
//println(
// "Time taken seconds: " + t)
t
}
def factorial(n: BigInt): BigInt = {
@tailrec
def process(n: BigInt, acc: BigInt): BigInt = {
//println(acc)
if (n <= 0) acc
else process(n - 1, n * acc)
}
process(n, 1)
}
implicit val ec =
ExecutionContext.fromExecutor(Executors.newFixedThreadPool(2))
val f1: Future[Stream[Long]] =
Future.sequence(
(1 to 50).toStream.map(x => Future { time(factorial(100000)) }))
f1.onComplete {
case Success(s) => {
println("Success : " + s.foldLeft(0L)(_ + _) + " seconds!")
}
case Failure(f) => println("Fails " + f)
}
import scala.concurrent.duration._
Await.ready(Future { 10 }, 10000 minutes)
}
我有上面的 Factorial 代码需要使用多个内核来更快地完成程序,并且应该使用更多的内核。
所以我改变了,
Executors.newFixedThreadPool(1) 使用 1 个核心
Executors.newFixedThreadPool(2) 使用 2 个内核
当改为1核时,结果会在127秒后出现。 但是当更改为 2 核 时,我会得到 157 秒。
我的疑问是,当我增加核心(并行度)时,它应该会提供良好的性能。但事实并非如此。为什么?
如果我错了或遗漏了什么,请纠正我。
提前致谢。
【问题讨论】:
标签: scala performance future