Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
Delphi 12 Athens
|
Re: Zugriffsgeschwindigkeit auf mehrdimensionale Arrays
4. Mai 2009, 10:54
Um auf die ursprüngliche Fragestellung zurück zu kommen, hier mein Test:
Delphi-Quellcode:
const
x=50; y=14; z=14; // Variante 1
// x=1274; y=2; z=2; // Variante 2
var
mein_Array : array[0..x,0..y,0..z,0..x,0..y,0..z] of double;
procedure TForm1.Button1Click(Sender: TObject);
var
i, j, k, l, m, n, idx: integer;
x1, x2: LongWord;
begin
Button1.Caption := '';
x1 := GetTickCount;
for i := 0 to x do
for j := 0 to y do
for k := 0 to z do
for l := 0 to x do
for m := 0 to y do
for n := 0 to z do
mein_Array[i,j,k,l,m,n] := i * j * k * l * m * n;
x2 := GetTickCount;
Button1.Caption := IntToStr(x2 - x1);
end;
Vor dem Test einer Variante habe ich Windows jeweils neu gestartet.
Die Funktion wurde nach jedem Programmstart 8 mal wiederholt aufgerufen.
Code:
Durchlauf 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8
-----------------------------------------------------------------------
Variante 1
1.Programmstart 15,0 | 82,3 | 17,8 | 2,1 | 1,5 | 1,7 | 1,5 | 1,3
2.Programmstart 12,5 | 53,5 | 4,6 | 1,7 | 1,3 | 1,3 | 1,3 | 1,2
Variante 2
1.Programmstart 15,7 | 85,3 | 24,0 | 2,5 | 1,8 | 1,7 | 1,7 | 1,7
2.Programmstart 11,1 | 37,6 | 3,9 | 1,9 | 1,7 | 1,6 | 1,7 | 1,7
Beide Varianten von x,y,z sind in etwa gleich schnell.
Entscheident ist hier das Auslagern des Speichers durch Windows.
In der Variante 2 müssen allerdings deutlich mehr innere Schleifen initialisiert werden.
Das könnte die geringen Zeitabweichungen erklären.
|