Angenommen, wir haben eine Fortran-Funktion (zum Beispiel ein mathematisches Optimierungsalgorithmus), die als Eingabe verwendet, eine andere Fortran-Funktion:Effizienzverlust aufgrund der Verwendung von Funktionszeiger anstelle von if-Block
myOptimizer(func)
Jetzt je nach Nach Wahl des Benutzers könnte die Eingabefunktion aus einer Liste mehrerer verschiedener Funktionen bestehen. Diese Auswahlliste kann über einen if-Block realisiert werden:
if (userChoice=='func1') then
myOptimizer(func1)
elseif (userChoice=='func2') then
myOptimizer(func2)
elseif (userChoice=='func3') then
myOptimizer(func3)
end if
Alternativ könnte ich auch Funktionszeiger definieren, und schreibe dies als,
if (userChoice=='func1') then
func => func1
elseif (userChoice=='func2') then
func => func2
elseif (userChoice=='func3') then
func => func3
end if
myOptimizer(func)
Basierend auf meinen Tests mit Intel Fortran Compiler 2017 Mit O2-Flag ist die zweite Implementierung um mehrere Faktoren langsamer (4-5 mal langsamer als die if-Block-Implementierung). Aus der Perspektive der Softwareentwicklung würde ich den zweiten Ansatz bevorzugen, da er zu einem viel prägnanteren und saubereren Code führt, zumindest in meinem Problem, wo ein fester Arbeitsablauf mit verschiedenen möglichen Eingabefunktionen für den Arbeitsablauf vorhanden ist. Die Leistung spielt jedoch auch in dem Problem eine Rolle.
Ist dieser Leistungsverlust bei indirekten Funktionsaufrufen in allen Fortran-Codes zu erwarten? oder ist es ein Compiler-abhängiges Problem? Gibt es eine Lösung für indirekte Funktionsaufrufe ohne Leistungsverlust? Wie wäre es mit anderen Sprachen wie C/C++?
Können Sie ein vollständiges Beispiel vorbereiten ([mcve])? Es könnte wichtig sein, ob die Schnittstellen explizit sind, was die Merkmale sind und so weiter. – francescalus