红宝石的投掷和效率

时间:2012-11-20 23:29:10

标签: ruby performance try-catch throw control-structure

Ruby中的

catch意味着跳出深层嵌套的代码。在Java中,例如用于处理异常的Java try-catch可以实现相同的功能,但它被认为是不好的解决方案,效率也非常低。在Ruby中处理异常我们有begin-raise-rescue,我认为将它用于其他任务也是昂贵的。

Ruby的catch-throw真的是一个比begin-raise-rescue更有效的解决方案,还是有其他理由用它来破坏嵌套块而不是begin-raise-rescue

2 个答案:

答案 0 :(得分:6)

除了作为失控结构的“正确”方法之外,catch-throw也明显更快(在我的测试中快10倍)。查看this gist以获取我的代码和结果。

答案 1 :(得分:6)

Josh's answer是正确的。我想添加有关catch-throwraise-rescue的更多信息。

catch-throw用于流控制,而raise-rescue用于异常/错误处理。不同的是:backtrace(流量控制)不需要catch-throw。相信我,导致raise-rescue运行慢于catch-throw 10次Josh's gist的主要原因raise-rescue需要花费大量时间来创建backtrace对象。

如果您想在没有回溯的情况下raise,请使用语法:

raise <type>, <message>, <backtrace>

结帐my gistraise without backtraceraise with backtrace快得多。

2016年4月更新:

我已更新my gist

  • 修正了“休息”测试
  • 为较新的ruby版本2.1.8,2.2.4,2.3.0
  • 添加了基准测试结果