1

我有一个简单的程序来使用 ExecutionContext.Implicits.global 中的期货来执行阻塞 IO。我想对执行此 IO 100 次的性能进行基准测试,但我的循环在所有未来完成之前结束。有没有办法仅在推送到 ExecutionContext 的所有任务完成时才终止?

4

1 回答 1

1

在没有任何代码的情况下,我将提供一个简单的版本,但需要注意的是,这是一种不准确的测量方式,对于需要少量时间的事情来说不是很好。仅当您的测量操作实际上需要相当长的时间时才真正有用,因此大部分时间都花在 Future 而不是测试代码中。

import scala.concurrent._
import scala.concurrent.duration._
import ExecutionContext.Implicits.global

val myList = (1 to 10)

val start = System.currentTimeMillis

val seqFutures = for (elem <- myList) yield {
    Future {
      Thread.sleep(5000) // blocking operation
    }
}

val result = Future.sequence(seqFutures)

Await.result(result, 30.seconds)
val end = System.currentTimeMillis

println(s"${end-start} seconds")

如果您将有大量阻塞 IO 调用,则值得为阻塞 IO 配置一个具有更大线程池的单独执行上下文,以避免阻塞 IO 消耗所有线程。

于 2015-02-25T03:58:49.983 回答