Erlang'catch'表达与try/catch在效率方面

Bar*_*ant 5 erlang performance runtime-error exception processing-efficiency

有人对此提出了类似的问题,但并未按照相同的条款提出问题.

我试图安全地解码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.
Run Code Online (Sandbox Code Playgroud)

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

我只是在学习二郎,所以也许答案就是盯着我.

leg*_*cia 11

不,这是另一种方式:避免catch因为它总是构建堆栈跟踪. try+ catch如果您要求,则仅构建堆栈跟踪erlang:get_stacktrace().

请参阅Heads-up:get_stacktrace()的费用,由Richard Carlsson在2013-11-05发布到erlang-questions上,全文.让我举几个部分:

(执行摘要:异常便宜,但是erlang:get_stacktrace()有点昂贵;另外,避免'捕获Expr'.)

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

最后,这也是将旧的'catch Expr'重写为'try Expr catch ... end'[...]的另一个原因.

  • 您可能还希望`spawn_monitor`是一个无痛的可崩溃过程,它会立即向您发送成功消息或死亡记录(监视器),而不会鼓励任何"try..catch"疯狂.*有时*这是理想的解决方案.有时不是.一如既往,基准.如果您正在捕获*很多*错误的输入数据,那么崩溃可能是一个较轻的负载.如果99%的输入数据是好的,那么`try..catch`可能更好. (2认同)