ZWEITE BEARBEITUNG:This pull request auf github wird das Problem beheben. Solange Julia v0.5 + läuft, sind anonyme Funktionen genauso schnell wie normale Funktionen. Also Fall geschlossen.Julia Compiler scheint nicht zu optimieren, wenn eine Funktion eine Funktion übergeben wird
EDIT: Ich habe die Frage und Funktion Definitionen zu einem allgemeineren Fall aktualisiert.
Für ein einfaches Beispiel scheint der Julia-Compiler nicht zu optimieren, wenn eine Funktion eine Funktion übergeben oder eine Funktion innerhalb einer Funktion definiert ist. Das überrascht mich, da dies in Optimierungspaketen sicherlich sehr häufig vorkommt. Habe ich Recht oder mache ich etwas Dummes? Ein einfaches Beispiel:
f(a::Int, b::Int) = a - b #A simple function
function g1(N::Int, fIn::Function) #Case 1: Passing in a function
z = 0
for n = 1:N
z += fIn(n, n)
end
end
function g2(N::Int) #Case 2: Function defined within a function
fAnon = f
z = 0
for n = 1:N
z += fAnon(n, n)
end
return(z)
end
function g3(N::Int) #Case 3: Function not defined within function
z = 0
for n = 1:N
z += f(n, n)
end
return(z)
end
Dann laufe ich den folgenden Code, die drei Fälle zu Zeit:
#Run the functions once
g1(10, f)
g2(10)
g3(10)
@time g1(100000000, f)
@time g2(100000000)
@time g3(100000000)
Und die Zeiten sind:
elapsed time: 5.285407555 seconds (3199984880 bytes allocated, 33.95% gc time)
elapsed time: 5.424531599 seconds (3199983728 bytes allocated, 32.59% gc time)
elapsed time: 2.473e-6 seconds (80 bytes allocated)
Viele Speicherzuweisung und die Garbage Collection für die ersten beiden Fälle. Könnte jemand erklären warum?
Wirklich nützliche Antwort, danke.Würdest du sagen, dass an diesem Punkt des Entwicklungszyklus, wenn die Leistung kritisch ist, es vermieden werden sollte, Funktionen als Argumente für Funktionen zu übergeben? Danke noch einmal. –
Ich denke, es hängt mehr davon ab, wie oft die Funktion aufgerufen wird. Wenn die aufgerufene Funktion sehr schnell läuft und viele Male aufgerufen wird, wird sie ziemlich unangenehm sein. Wenn die Funktion einige Male aufgerufen wird und entweder ein kleiner Teil des Gesamtprogramms oder die Ausführung der Funktion länger dauert, ist es in Ordnung. – IainDunning
Verstanden. Prost. –