Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#14

Re: dynamische Arrays vergrößern

  Alt 10. Jun 2009, 21:06
das Inc fällt hier fast garnicht auf ... könnte auch aLen:=aLen+1; nehmen und es ändert sich nix.


bei obrigen Code (lezter Post), wird einfach nur das Array immer um 1 vergrößert,

ebenso wie hier ... hier wird die Länge auf i gesetzt und i ist 1 größer als die Länge:
Delphi-Quellcode:
var
  a: Array of Integer;
  aLen, i, i2, i3: Integer;
  C, C2: LongWord;

begin
  C := GetTickCount;
  for i2 := 1 to 10000000 do begin
    i := Length(a) + 1;

    SetLength(a, i);

    a[i - 1] := 123456;
  End;
  C := GetTickCount - C;

  a := nil;
  aLen := 0;

  C2 := GetTickCount;
  for i2 := 1 to 10000000 do begin
    i := aLen + 1;

    aLen := i;
    i3 := (aLen + $FF) and not $FF;
    if i3 <> Length(a) then SetLength(a, i3);

    a[i - 1] := 123456;
  end;
  C2 := GetTickCount - C2;

  Application.MessageBox(PChar(Format('C = %d ms'#13#10'C2 = %d ms', [C, C2])), 'Test');
end;
hier wird die länge aus der Zählervariable genommen
Delphi-Quellcode:
var
  a: Array of Integer;
  aLen, i, i2, i3: Integer;
  C, C2: LongWord;

begin
  C := GetTickCount;
  for i2 := 1 to 10000000 do begin
    i := i2;

    SetLength(a, i);

    a[i - 1] := 123456;
  End;
  C := GetTickCount - C;

  a := nil;
  aLen := 0;

  C2 := GetTickCount;
  for i2 := 1 to 10000000 do begin
    i := i2;

    aLen := i;
    i3 := (aLen + $FF) and not $FF;
    if i3 <> Length(a) then SetLength(a, i3);

    a[i - 1] := 123456;
  end;
  C2 := GetTickCount - C2;

  Application.MessageBox(PChar(Format('C = %d ms'#13#10'C2 = %d ms', [C, C2])), 'Test');
end;
wie gesagt, die zuweisung zu den Zählervariablen hat kaum Einfluß: ... hier verbraucht im Vergleich das Kopieren des Arrays sooooo viel Zeit.

Was aber auffäll ist, daß die Schrittweise verwaltung etwas mehr aufwand benötigt.
- 3 Zeilen, statt nur Einer
- es ist unübersichtlicher bzw. fehleranfälliger
- und man muß aLen verwenden, um die Anzahl der tatsächlichen Daten im Array zu bekommen und nich Length(a)
$2B or not $2B
  Mit Zitat antworten Zitat