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

标签 performance scala testing future scalatest

我有一个非常简单的测试用例(scalatest,但没关系),我提供了两个访问某些资源的实现,这个方法返回 Try 或一些案例类实例。

测试用例:

"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 测试选项卡中,我看到基于 future 的版本比同步版本慢两倍,我的问题是显式调用 Await.result 有开销吗?如果不是,为什么它会减慢执行速度?感谢任何帮助,谢谢。

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

最佳答案

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

关于performance - Await在测试用例中是否有开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39980525/

相关文章:

scala - Slick 3.0.0 - 如何使用 joinLeft 对查询进行排序

asp.net-mvc-4 - 如何创建 ASP.NET WEB API 功能测试

c# - SQL 查询在 .NET 应用程序中很慢,但在 SQL Server Management Studio 中是瞬时的

java - Java中的大量对象(使用HashMap)

php - 处理 php 和 mysql 的最快方法?

scala - 将 `Any` 类型转换为 scala 中的 `Map` 类型

scala - Spark /斯卡拉 : Passing RDD to Function

oracle - 测试 Oracle 数据库是否存在常见错误/性能问题?

android - 如何在 Android 上测试 "App Process Killed"路由?

performance - 在内存中交换未对齐的 64 位值的字节的最快方法是什么?