我有一个非常简单的测试用例(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
会产生开销吗?如果没有,为什么它会减慢执行速度?感谢任何帮助,谢谢。
注意:我知道这不是衡量生产系统性能的最佳方法。但它在列表中说明每个测试用例花费了多少时间。
答案 0 :(得分:2)
是的,Await.result
的开销会很小,但实际上它可能并不算多。 Future {}需要隐式作用域中的ExecutionContext(线程池或线程创建者),因此您无法成功使用它而无需导入默认执行上下文(这将简单地生成一个线程)或其他一些上下文。例如,如果您正在使用默认执行上下文,那么您将拥有两个线程而不是一个线程,这将涉及上下文切换的一些开销。它不应该是多少。如果'慢两倍'意味着40毫秒而不是20毫秒,也许它不值得担心。