Podobne pytanie zostało zadane na ten temat, ale nie zostało dokładnie zadane w tych samych warunkach.Erlang "catch" ekspresji vs try/catch pod względem wydajności
Próbuję bezpiecznie odszyfrować pliki binarne base64, w kontekście, w którym jest to możliwe, dane wejściowe nie będą kodowane binarnie, a nawet kodowane base64.
Erlang mówi, niech to się zepsuje i poradzi sobie z tym - jeśli mam to zrobić, jaki jest najbardziej efektywny sposób. Wydajność jest bardzo ważna w tym systemie.
Wiem, aby uniknąć try/catch, ponieważ tworzy on pełną ścieżkę śledzenia - jednak czy słowo kluczowe catch jest sensowne w tym kontekście? Czy słowo kluczowe "catch" jest szybsze/wydajniejsze?
W funkcji takich jak
safe_decode(Binary) ->
case catch base64:decode(Binary) of
<<Result/binary>> -> {ok, Result};
{'EXIT', _} -> {not_base64, Binary}
end.
Czy to naprawdę bardziej wydajny niż połowu spróbować? Jak najlepiej poradzić sobie z tym scenariuszem w systemie, w którym ważna jest wydajność, tj. Awarie, które wymagają budowania śladu stosu i/lub wymagają więcej przetwarzania niż szczęśliwą ścieżkę należy traktować tak wydajnie, jak to możliwe.
Po prostu uczę się erlangu, więc może odpowiedź jest na mnie zwrócona.
Bardzo interesujące - dziękuję! –
Możesz także chcieć "spawn_monitor" bezboleśnie proces, który albo wyśle ci wiadomość sukcesu lub notatkę śmierci (monitor) od razu, bez zachęcania do jakiegokolwiek szaleństwa "try..catch". * Czasami * jest to idealne rozwiązanie. Czasami nie. Jak zawsze, benchmark. Jeśli złapiesz * dużo * złych danych wejściowych, awarie mogą być lżejsze. Jeśli 99% twoich danych wejściowych jest dobre, to 'try..catch' jest prawdopodobnie lepsze. – zxq9