Erlang 'catch'表达式与尝试/捕获在效率方面的比较



对此也提出了类似的问题,但问题的措辞并不完全相同。

我正在尝试安全地解码base64二进制文件,在这种情况下,输入可能不是二进制文件,甚至不是base64编码的。

Erlang说让它崩溃并处理它——如果我要这样做,什么是最有效的方法。在这个系统中,效率非常重要。

我知道要避免try/catch,因为它构建了一个完整的堆栈跟踪——然而,catch关键字对这个上下文合理吗?catch关键字是否更快/更高效?

在等功能中

safe_decode(Binary) ->
case catch base64:decode(Binary) of
<<Result/binary>> -> {ok, Result};
{'EXIT', _} -> {not_base64, Binary}
end.

这真的比尝试接球更有效率吗?在效率很重要的系统中,如何最好地处理这种情况,即需要尽可能高效地处理涉及构建堆栈跟踪和/或需要比愉快路径更多处理的崩溃。

我只是在学习二郎,也许答案就在眼前。

不,相反:避免catch,因为它总是构建堆栈跟踪。try+catch仅在您要求它使用erlang:get_stacktrace()时构建堆栈跟踪。

请参阅Richard Carlsson于2013-11-05在erlang questions上发布的《提醒:get_stacktrace()的成本》,了解完整的故事。让我列举几个部分:

(执行摘要:异常便宜,但erlang:get_stacktrace()种类价格昂贵;此外,请避免"catch Expr"。)

当然,在许多情况下调用get_stacktrace()仍然有效,例如,当进程正在放弃或写入崩溃时日志中的信息,或者只发生很少的事情堆栈跟踪信息很有用,但在库函数可能会在循环中大量使用。

最后,这也是重写"catch Expr"转换为"try Expr catch…"。。。结束'[…]

最新更新