Ich arbeite an einer Funktion, die von einem relativ heißen Codepfad in unserer vorhandenen Codebasis aufgerufen wird. Das erste, was die Funktion tut, ist Aufruf erlang:get_stacktrace/0
in einem Try-Catch-Block so können wir die stacktrace erhalten:Alternativen zu erlang: get_stacktrace/0 um Informationen über den Aufrufer einer Funktion zu erhalten?
the_function() ->
[_|Trace] = try error(x) of
_ -> error(impossible)
catch
error:x -> erlang:get_stacktrace()
end,
...
Wir die stacktrace halten, so dass wir Informationen über den Aufrufer der Funktion haben. Ich habe gelesen, dass erlang:get_stacktrace/0
ist nicht immer eine billige Funktion zu rufen (http://erlang.org/pipermail/erlang-questions/2013-November/075928.html). Da dies auf einem Hot-Code-Pfad ist, möchte ich es durch etwas einfacheres ersetzen. Gibt es eine andere Möglichkeit, Informationen über die aufrufende Funktion, wie Modul- und Funktionsname, Leitungsnummer usw. zu erhalten, ohne get_stacktrace
anrufen zu müssen?
Die Frage geht davon aus, dass Informationen über den Aufrufer unbedingt erforderlich sind. Warum brauchen Sie es? Brauchen Sie es immer oder nur, wenn Fehler auftreten? Was versuchst du wirklich zu erreichen? Haben Sie in Betracht gezogen, dass Anrufer die erforderlichen Informationen einfach als Argument übergeben müssen? –
@SteveVinoski Ich arbeite mit einer vorhandenen Codebasis, und ja, Informationen über den Anrufer ist eine Voraussetzung. Ich könnte den Code aktualisieren, damit die erforderlichen Anruferinformationen als weiteres Argument übergeben werden können. Dazu müssten mehrere aufrufende Funktionen aktualisiert werden, was ich gerne vermeiden würde. Ich habe erlang gehört: process_info/2 kann mir die gleichen Informationen geben und möglicherweise billiger zu nennen als get_stacktrace. Irgendwelche Gedanken dazu? – Stratus3D
Wenn es so heiß ist, wie es scheint, würde ich empfehlen, es so weit wie möglich zu straffen, auch wenn es bedeutet, dass der Aufrufer zusätzliche Arbeit leisten muss, um es aufzurufen. Ich weiß nicht, ob es besser ist, 'process_info/2' zu nennen; Sie müssen das sicher messen. –