【问题标题】:cost of throwing exceptions in Scala在 Scala 中抛出异常的成本
【发布时间】:2018-10-18 07:30:58
【问题描述】:

在 Scala 中抛出异常是否昂贵?

更具体地说,当为将来的调用映射异常时,例如:

import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global

val fut: Future[Int] = Future(1)

xy在性能方面有很大区别吗?

case class MappedException(message: String) extends Exception(message)

val x = fut.recover {
  case e => throw MappedException(e.getMessage)
}

val y = fut.recoverWith {
  case e => Future.failed(MappedException(e.getMessage))
}

【问题讨论】:

  • 我认为在昂贵性方面没有“太大”的差异(如果任何异常处理/堆栈展开开销没有被所有“映射”相形见绌,那会非常惊讶)。第二个在风格上似乎更惯用(你不​​想throwScala 中的异常,你想返回失败)。我怀疑两者的最终结果是相同的。
  • 只有微基准测试才能提供明确的答案。然而,正如 Josh Bloch 在 Effective Java(第 69 条,第 3 版)中指出的那样,对控制流使用异常(就像您在计算 x 时所做的那样)可能会导致性能下降。你计算y 的方式——我只是在猜测——比你计算x 的方式更有效,而且无论如何,更惯用的Scala 代码。将异常视为值而不是抛出它们。
  • 标题具有误导性,您真正要问的是Future.applyFuture.failed(或Future.successful)之间的区别。第二个效率更高,所以y 应该更快。

标签: scala exception-handling throw


【解决方案1】:

不,我认为不会有太大的不同。

你应该自己测量它:https://github.com/ktoso/sbt-jmh

JMH 是一个 Java 工具,用于构建、运行和分析以 Java 和其他针对 JVM 的语言编写的纳米/微米/毫/宏基准测试。

【讨论】:

    猜你喜欢
    • 2016-02-21
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 2011-09-07
    相关资源
    最近更新 更多