/ / Julia - warum sind Loops schneller - Performance, Julia-Lang

Julia - warum sind Loops schneller - Performance, Julia-Lang

Ich habe einen Hintergrund in MATLAB, daher tendiere ich dazu, alles zu vektorisieren. In Julia habe ich jedoch diese beiden Funktionen getestet:

function testVec(n)
t = [0 0 0 0];
for i = 1:n
for j = 1:4
t[j] = i;
end
end
end

function testVec2(n)
t = [0 0 0 0];
for i = 1:n
t.= [i i i i];
end
end

@time testVec(10^4)
0.000029 seconds (6 allocations: 288 bytes)
@time testVec2(10^4)
0.000844 seconds (47.96 k allocations: 1.648 MiB)

Ich habe zwei Fragen:

  1. Warum sind Loops schneller?
  2. Wenn Schleifen tatsächlich schneller sind, gibt es "intelligente" Vektorisierungstechniken, die Schleifen imitieren? Die Syntax für Schleifen ist hässlich und lang.

Antworten:

4 für die Antwort № 1

In dem testVec2 Bei dieser Methode weist der Code einen temporären Vektor zum Halten zu [i i i i] für jede Instanz von i in deiner Schleife. Diese Zuteilung ist nicht kostenlos. Sie können den Beweis dafür in der Anzahl der Zuweisungen sehen, die in Ihren Timing-Ergebnissen gedruckt wurden. Sie könnten Folgendes versuchen:

function testVec3(n)
t = [0 0 0 0]
for i=1:n
t .= i
end
end

3 für die Antwort № 2
  1. Es ist alles Schleifen unter der Haube. Die vektorisierten Ausdrücke werden sowohl in Julia als auch in Matlab in Schleifen übersetzt. Am Ende sind es alle Schleifen. In Ihrem speziellen Beispiel heißt es @sam, weil Sie eine Reihe zusätzlicher Arrays zuweisen, die Sie vermeiden können, wenn Sie explizit eine Schleife ausführen. Der Grund, warum Sie dies in Matlab immer noch tun, ist, dass dann alles in Funktionen gemischt wird, die in einer Hochleistungssprache (wahrscheinlich C oder Fortran) geschrieben sind. Es lohnt sich also auch, wenn Sie zusätzliche Zuweisungen vornehmen.

  2. In der Tat gibt es, wie @sam gezeigt hat. Hier"s ein Blog-Eintrag, der Ihnen alles erzählt, was Sie über Rundfunk und Loop-Fusion wissen müssen.