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

时间:2017-10-23 09:19:59

标签: performance exception erlang runtime-error 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.

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

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

1 个答案:

答案 0 :(得分:10)

不,反之亦然:避免try,因为它始终构建堆栈跟踪。 catch + erlang:get_stacktrace()只有在 <html> <head></head> <body> <form action="<?php echo base_url();?>index.php/Vehicle_controller/addfun" method="post"> <table align="center" border="1" cellspacing="8px" cellpadding="8px"> <h1 style="margin-left:44%;">Vehicle owner details</h1> <tr> <td>Vehicle type:</td> <td><select class="veh" name="vehtype"> <option value="nil">Choose below:</option> <option value="bus" id="bus">Bus</option> <option value="car" id="car">Car</option> <option value="bike" id="bike">Two wheeler</option> </select> <input type="textbox" name="car" style="visibility:hidden;"/></td> </tr> <tr> <div class="bus"> <td>Bus type:</td> <td><input type="text" name="type"></td> </div></tr> <tr> <div class="bus"> <td>Owner name:</td> <td><input type="text" name="name"></td> </div> </tr> <tr> <div class="bus"> <td>License no:</td> <td><input type="text" name="license"></td> </div> </tr> <tr> <div class="bus"> <td>Engine status:</td> <td><input type="radio" id="success" name="eng" value="success">Success<br> <input type="radio" id="failed" name="eng" value="failed">Failed</td> </div> </tr> <tr> <div class="bus"> <td>Purchased on:</td> <td><input type="date" name="date"></td> </div> <tr> <div class="bus"> <td>Vehicle status:</td> <td><select name="status"> <option value="nil">choose below:</option> <option value="using" id="using">Using</option> <option value="sold" id="sold">Sold</option> </select></td> </div> </tr> <tr> <div class="car"> <td>Car model:</td> <td><input type="text" name="model"></td> </div></tr> <tr> <div class="car"> <td>Owner:</td> <td><input type="text" name="carname"></td> </div></tr> <tr> <div class="car"> <td>license no:</td> <td><input type="text" name="carnum"></td> </div></tr> <tr> <div class="car"> <td>Car condition:</td> <td><input type="radio" name="carradio" value="excellent">Excellent<br> <input type="radio" name="carradio" value="bad">Bad</td> </div></tr> <tr align="center"> <td><input type="submit" value="Submit"></td> </tr> </table> </form> </body> </html> <script> $(document).ready(function() { $("#bus").click(function() {alert("bkbk"); $(".bus").show(1000,"swing",function(){ }); $(".car").hide(1000,"swing",function(){ }); }); $("#car").click(function() { $(".car").show(1000,"swing",function(){ }); $(".bus").hide(1000,"swing",function(){ }); }); }); </script> 要求时才会构建堆栈跟踪。

有关完整报道,请参阅Richard Carlsson在2013-11-05发布的issue,发布到erlang-questions。让我举几个部分:

  

(执行摘要:例外便宜,但是erlang:get_stacktrace()类   昂贵的;另外,避免捕捉Expr&#39;。)

  

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

  

最后,这也是重写旧事件的另一个原因   赶上Expr&#39;进入&#39;试试Expr catch ... end&#39; [...]