![]() |
Dynamische Arrays, Optimierung des Zugriffs!?!?
Also ich habe folgende Frage zu Array Elementen, nehmen wir an ich habe eine Klasse:
Delphi-Quellcode:
TcUVarRec = record
lConst: array of ShortString; // Liste der Konstanten lVar: array of ShortString; // Liste der Variablen( Global ) end; TcUVar = class private cVar: TcUVarRec; public procedure AddVar(vName: ShortString; vType: ShortString); [...] end; Und die Funktion dazu:
Delphi-Quellcode:
procedure TcUVar.AddVar(vName: ShortString; vType: ShortString);
var i: integer; begin for low(cVar.lVar) to high(cVar.lVar) do [...] end; So nun die Fragen: - Wäre es besser das "High" in einer Variable zu Speichern und dann immer hochzuzählen?? - Ich vermute Delphi tut das High in einer Variable abspeichern während es die Schleife durchläuft?? mfg Speedmaster |
Re: Dynamische Arrays, Optimierung des Zugriffs!?!?
Wenn ich jetzt nix falsch verstehe, dann ist low(cVar.lVar) immer 0.
Also wird der Compiler die Schleife vermutlich eh ![]()
Delphi-Quellcode:
und dadurch findet der abgleich mit dem wert von High(cVar.lVar) nicht jedesmal statt und dadurch wird auch nicht die Funktion nie aufgerufen...
for high(cVar.lVar) downto 0 do
[...] qed, will ich mal hoffen Grüße Benjamin [Edit=Uuuups]Das ist ja .NET, :oops: ich hoffe das was ich hier erzähle gilt auch dafür ! |
Re: Dynamische Arrays, Optimierung des Zugriffs!?!?
Zitat:
|
Re: Dynamische Arrays, Optimierung des Zugriffs!?!?
es wird optimiert :)
|
Re: Dynamische Arrays, Optimierung des Zugriffs!?!?
Hier sollte aber beachtet werden, dass ein .Net Compiler niemals zuviel optimieren sollte!
Das würde dem JIT die Möglichkeit rauben den Code entsprechend der bestehenden Situation und Plattform zu optimieren. In dem Beispiel wird entgegen aller Erwartungen Test1 schneller oder mindestens genauso schnell wie Test2 sein.
Code:
Neben code prediction und anderen Spielereien gibt es bestimmte Typen, auf die der JIT ganz speziell reagiert.
public class Class1
{ public Class1() { string[] strings = new string[] {"a", "b", "c", "d"}; Test1(strings); Test2(strings); } void Test1(string[] stringArray) { for (int i = stringArray.GetLength(0); i >= 0; i--) { ... } } void Test2(string[] stringArray) { int arrayLength = stringArray.GetLength(0); for (int i = arrayLength; i >= 0; i--) { ... } } } Array gehört dazu. (Aber auch IList, IEnumerable, Attribute,...) |
Re: Dynamische Arrays, Optimierung des Zugriffs!?!?
Naja meine Frage war ja auch, ob es schneller ist eine VARIABLE anzulegen um dann es so zu machen:
Delphi-Quellcode:
for i:=low(MeinArray) to MaxVariable do
|
Re: Dynamische Arrays, Optimierung des Zugriffs!?!?
Laut Brechi wird der Code optimiert, also wird diese Variable in der Schleife nie verwendet=> nein packe das nicht in eine Variable
|
Re: Dynamische Arrays, Optimierung des Zugriffs!?!?
Zitat:
Anstatt SethLength(Vari,high(Vari)+1) zu setzen, SethLength(Vari,MeineVar+1) und dannach inc(MeineVar) |
Re: Dynamische Arrays, Optimierung des Zugriffs!?!?
Du machst dir Sorgen wegen ein paar kleineren Optimierungen und trotzdem verwendest du etwas in .Net, das .Net gar nicht kann? :gruebel:
Array instanzen in .Net sind IMMER fixed length. Im Gegensatz zu dyn. arrays in Delphi32 kosten Größenänderungen auch viel mehr Resourcen. Sie sind aber ganz nett als Rückgabewerte von Funktionen, die nicht mehr verändert werden müssen. Mich würde jetzt mal interessieren, wie setLength die Werte des alten in den neuen Array kopiert. Er kann keinen Overload für deinen value type haben, also wird er es wohl auf object boxen und danach wieder rausboxen. Was das heißt muss ich wohl nicht extra erwähnen, oder? :zwinker: Ansonsten werfe ich das hier in den Raum: ![]() .Net ist einfach zu anders um dort genauso zu programmieren, wie man es vorher gewohnt war... ;) |
Re: Dynamische Arrays, Optimierung des Zugriffs!?!?
Zitat:
Wenn du die beiden Schleifen auf Geschwindigkeit testen willst sollte es so aussehen:
Code:
Nur dann wird bei jedem Durchlauf die Abbruchbedingung überprüft. Und je nachdem wie komplex die Methode "GibMirAnzahlElementeImArray" ist kann dies entsprechen dauern (und wenn das Array dann noch mehrere Tausen Elemente besitzt.....)
void Test1(string[] stringArray)
{ for (int i = 0; i <= GibMirAnzahlElementeImArray(); i++) { ... } } void Test2(string[] stringArray) { int arrayLength = GibMirAnzahlElementeImArray(); for (int i = 0; i <= arrayLength; i++) { ... } } |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:20 Uhr. |
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