Await是否在测试用例中有开销

时间:2016-10-11 15:08:06

标签: performance scala testing future scalatest

我有一个非常简单的测试用例(scalatest,但并不重要)我提供了两个访问某些资源的实现,这个方法返回Try或者一些case类实例。

测试用例:

"ResourceLoader" must
    "successfully initialize resource" in {
    /async code test
    noException should be thrownBy Await.result(ResourceLoader.initializeRemoteResourceAsync(credentials, networkConfig), Duration.Inf)
    }

"ResourceLoader" must
    "successfully sync initialize remote resources" in {
    noException should be thrownBy ResourceLoader.initializeRemoteResource(credentials, networkConfig)
  }

这测试测试访问某些远程资源的不同代码

同步版

def initializeRemoteResource(credentials: Credentials, absolutePathToNetworkConfig: String): Resource = {
  //some code accessing remote server
}

异步版

def initializeRemoteResourceAsync(credentials: Credentials, absolutePathToNetworkConfig: String): Future[Try[Resource]] = {
  Future {
    //the same code as in sync version
  }
}

在IDEA测试选项卡中,我发现基于未来的版本比同步版本慢两倍,我的问题是显式调用Await.result会产生开销吗?如果没有,为什么它会减慢执行速度?感谢任何帮助,谢谢。

注意:我知道这不是衡量生产系统性能的最佳方法。但它在列表中说明每个测试用例花费了多少时间。

1 个答案:

答案 0 :(得分:2)

是的,Await.result的开销会很小,但实际上它可能并不算多。 Future {}需要隐式作用域中的ExecutionContext(线程池或线程创建者),因此您无法成功使用它而无需导入默认执行上下文(这将简单地生成一个线程)或其他一些上下文。例如,如果您正在使用默认执行上下文,那么您将拥有两个线程而不是一个线程,这将涉及上下文切换的一些开销。它不应该是多少。如果'慢两倍'意味着40毫秒而不是20毫秒,也许它不值得担心。