Laufzeit

Werbung
Laufzeit
Alice seufzte verstimmt. ′′ Ich denke, ihr könntet die Zeit besser anwenden,′′ sagte sie, ′′ als für Rätsel, die
keine Lösung haben.′′
′′
Wenn du die Zeit so gut kenntest wie ich,′′ sagte der Hutmacher, ′′ würdest du nicht davon reden, wie wir sie
anwenden, sondern wie sie uns anwendet.′′
(Lewis Carroll, ′′ Alice im Wunderland′′ )
1
Tic-Toc, Tic-Toc, ...
Warum untersucht der Dozent den Aufwand eines Algorithmus? Warum achtet der Übungsleiter darauf, ob
und wie oft eine Schleife durchgelaufen wird? Die Antwort birgt sich in der Laufzeit – der Rechner soll ja die
gestellte Aufgabe möglichst schnell lösen können.
Um die Schnelligkeit der Skripte zu testen, gibt es in MATLAB eine Stoppuhr. Sie schalten sie mit dem Befehl
tic an, stoppen und ablesen sie mit dem Befehl toc.
Beispiel:
Testen Sie die Stoppuhr an der Matrizenmultiplikation. Dazu schreiben Sie die drei Varianten der Funktion –
eine sehr naive Variante (mit 3 Schleifen)
1
2
3
4
5
6
7
8
9
10
11
12
function C = mult3(A,B)
[m,p] = size(A);
[~,n] = size(B);
C = zeros(m,n);
for i=1:m
for j=1:n
for k=1:p
C(i,j) = C(i,j) + A(i,k)*B(k,j);
end
end
end
end
eine Variante (mit 2 Schleifen), die das Skalarprodukt ausnutzt,
1
2
3
4
5
6
7
8
9
10
function C = mult2(A,B)
[m,~] = size(A);
[~,n] = size(B);
C = zeros(m,n);
for i=1:m
for j=1:n
C(i,j) = A(i,:)*B(:,j);
end
end
end
und eine Variante (mit 1 Schleife), die Vektor-Matrix-Produkt ausnutzt,
1
2
3
4
5
6
7
8
function C = mult1(A,B)
[m,~] = size(A);
[~,n] = size(B);
C = zeros(m,n);
for i=1:m
C(i,:) = A(i,:)*B;
end
end
Nun erstellen Sie ein Skript, das die Laufzeiten der drei Funktionen und der MATLAB-Multiplikation
vergleicht
1
n = 500;
2
A = rand(n,n);
3
B = rand(n,n);
4
5
tic
6
C = mult3(A,B);
7
toc
8
9
tic
10
D = mult2(A,B);
11
toc
12
13
tic
14
E = mult1(A,B);
15
toc
16
17
tic
18
Z = A*B;
19
toc
Da der Befehl toc auch die Ausgabe der verbrauchten Zeit übernimmt, bekommen Sie den folgenden Text
Elapsed time is 1.912391 seconds.
Elapsed time is 1.217017 seconds.
Elapsed time is 0.032592 seconds.
Elapsed time is 0.014934 seconds.
Wie Sie sehen, die MATLAB-Funktionen sind optimal programmiert und je mehr Sie sie verwenden, desto
schneller wird Ihr Programm laufen.
2
Speicher vs Prozessor
Es gibt weitere Möglichkeiten, die Laufzeit zu verringern – eine davon ist, nichts zweimal zu rechnen, d.h. die
Zwischenergebnisse zu speichern. Genauso wie bei Menschen, sind bei Computern das schnelle Denken und
gutes Gedächtnis verschiedene Eigenschaften. Für das ′′ Denken′′ ist der Prozessor (CPU = Central Processor
Unit) verantwortlich und für ′′ Gedächtnis′′ der Arbeitsspeicher (RAM = Random Access Memory). Aus
technischen Gründen werden die Prozessoren (fast) nicht mehr besser, der Speicher dagegen kann mittlerweile
mehr Information aufnehmen, als man für anspruchsvolle Programme braucht. Daher lautet die Grundregel
′′
Variablen sind billig, Laufzeit ist teuer.′′
Aus praktischer Sicht machen Sie einfach Folgendes – statt alles direkt zu berechnen, z.B. so
y = x^4+2012*x^2+1;
z = x^4-1799*x^2+2;
1
2
zerlegen Sie die Rechnung in mehrere wieder verwendbare Teile, etwa so
1
2
3
4
x2 = x*x;
x4 = x2*x2;
y = x4+2012*x2+1;
z = x4-1799*x2+2;
Somit erreichen Sie sogar noch mehr – der Prozessor kann nämlich manche Anweisungen schneller ausführen
als andere. Hier eine grobe Übersicht:
Sehr schnell
Schnell
Langsamer
Langsamer
Langsam
Sehr langsam
~, &, |
+, *
^
for, while, if
/
Herunterladen