Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi dynamische Arrays vergrößern (https://www.delphipraxis.net/135416-dynamische-arrays-vergroessern.html)

SimStar001 10. Jun 2009 19:32

Re: dynamische Arrays vergrößern
 
Zitat:

Zitat von alzaimar
Zitat:

Zitat von KahPee
Ist das vergrößern, der Länge um 10 schneller als das Vergrößern der Länge 10mal um 1?

Zitat:

Zitat von Luckie
Desweiteren hätte man sich diese Frage auch schnell durch ausprobieren beantworten können.

:zwinker:


Ich denke nicht, dass er dies hätte mit ausprobieren so eindeutig feststellen können! Oder :| :?:

himitsu 10. Jun 2009 19:44

Re: dynamische Arrays vergrößern
 
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);

    SetLength(a, i + 1);

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

  a := nil;
  aLen := 0;

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

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

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

  Application.MessageBox(PChar(Format('C = %d ms'#13#10'C2 = %d ms', [C, C2])), 'Test');
end;
Zitat:

---------------------------
Test
---------------------------
C = 1094 ms

C2 = 78 ms
---------------------------
OK
---------------------------

SimStar001 10. Jun 2009 19:56

Re: dynamische Arrays vergrößern
 
k überzeugt, aber wieso klappt das ganze bei der ersten methode nicht mit inc(i)? das wäre ja auch noch etwas schneller?

himitsu 10. Jun 2009 20:06

Re: dynamische Arrays vergrößern
 
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)

Luckie 10. Jun 2009 22:13

Re: dynamische Arrays vergrößern
 
Zitat:

Zitat von SimStar001
Ich denke nicht, dass er dies hätte mit ausprobieren so eindeutig feststellen können! Oder :| :?:

Das mit der Geschwindigkeit eventiull nicht so schnell, aber es ging ja ursprünglich darum ob der Inhalt erhalten bleibt, wenn man das dynamische Array vergrößert.

SimStar001 11. Jun 2009 18:06

Re: dynamische Arrays vergrößern
 
Ok stimmt, das hatte ich schon wieder vergessen...


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:50 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz