Geschwindigkeit bei List

28/03/2008 - 15:06 von Matthias | Report spam
Hallo NG,

ich hab mal ein Programm in Delphi geschrieben in dem ich auch eine
große Anzahl durchsuchen mußte. In Delphi hatte ich das mit einem
Record gemacht und bin den dann so durchlaufen :

TWpRecord = record // Enthàlt die Wegpunkte
szID : string[5];
szNode : string[30];
rLat : real;
rLon : real;
end;
pTWpRecord = ^TWpRecord;

var
pWpRecord : pTWpRecord;

procedure xy

pWpRecord := @aWpRecord[0];
for x := 0 to iOgWP do
begin
.
.
.
inc(pWpRecord);
end;

Ich glaube das Prinzip sollte klar sein.

Ok, das ganze jetzt mal als C# Version wàre ein kleines struct für den
Record
und eine List<T> zum aufnehmen der wegpunkte in die Liste.
Duchgehen dann ganz normal iterieren.
foreach() usw.

Problem ist das das etwa 177000 Wegpunkte sind !!!!

Duch die Zeigerarithmetik bei Delphi ging das recht schnell.
Bei C# dauert das mit der Liste ewig.

Was kann man da machen ?
Geht das irgendwie schneller ?

Matthias
 

Lesen sie die antworten

#1 Nicolas Pavlidis
28/03/2008 - 16:54 | Warnen spam
Matthias wrote:
Hallo NG,

ich hab mal ein Programm in Delphi geschrieben in dem ich auch eine
große Anzahl durchsuchen mußte. In Delphi hatte ich das mit einem
Record gemacht und bin den dann so durchlaufen :

TWpRecord = record // Enthàlt die Wegpunkte
szID : string[5];
szNode : string[30];
rLat : real;
rLon : real;
end;
pTWpRecord = ^TWpRecord;

var
pWpRecord : pTWpRecord;

procedure xy

pWpRecord := @aWpRecord[0];
for x := 0 to iOgWP do
begin
.
.
.
inc(pWpRecord);
end;

Ich glaube das Prinzip sollte klar sein.

Ok, das ganze jetzt mal als C# Version wàre ein kleines struct für den
Record
und eine List<T> zum aufnehmen der wegpunkte in die Liste.
Duchgehen dann ganz normal iterieren.
foreach() usw.



Naja das liegt daran dass foreach was anderes macht als eine "normale"
forschleife.

Da wird im Hintergrund ein Enumerator erzeugt und mittels MoveNext /
hasNext Aufrufen durch den Container gewandert.

Zwei Dinge würde ich machen (bin aber sicher kein Guru :-) ):

1) Mach aus dem struct eine class, "Instanzen" einer struct sind
werttypen, was bedeutet, dass deine Wegpunkte dauernd kopiert werden,
bei jedem Aufruf von MoveNext passiert das.

2) Nimm zur noch eine forschleife, List<T> unterstüzt Index - Zugriff.

Aber 1) sollte IMHO schon viel bringen.

Aber vielleicht weiß jemand hier noch mehr wie man das boosten kann.

HTH && LG
Nicolas

Ähnliche fragen