红宝石的投掷和效率

wrz*_*asa 5 ruby performance try-catch control-structure throw

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

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

Jos*_*osh 6

除了作为失控结构的"正确"方式之外,catch-throw速度也快得多(在我的测试中快10倍).查看我的代码和结果的要点.


Jac*_*Dam 6

乔希的回答是正确的.我想添加更多关于catch-throw和的信息raise-rescue.

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

如果你想raise没有回溯,请使用语法:

raise <type>, <message>, <backtrace>
Run Code Online (Sandbox Code Playgroud)

查看我的要点.raise without backtrace比...快得多raise with backtrace.

2016年4月更新:

我更新了我的要点:

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