AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Prism Dynamische Arrays, Optimierung des Zugriffs!?!?
Thema durchsuchen
Ansicht
Themen-Optionen

Dynamische Arrays, Optimierung des Zugriffs!?!?

Ein Thema von Speedmaster · begonnen am 14. Jun 2005 · letzter Beitrag vom 28. Jun 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Speedmaster
Speedmaster

Registriert seit: 4. Mär 2005
Ort: Karlsruhe
535 Beiträge
 
Delphi 2005 Personal
 
#1

Dynamische Arrays, Optimierung des Zugriffs!?!?

  Alt 14. Jun 2005, 18:02
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
Felix K.
Zitat:
Siehst du diesen Park da unten?
Jeden Tag lernen sich leute kennen und verlassen einander, und du hast dein ganzes Leben Zeit darin zu gehen!
  Mit Zitat antworten Zitat
BenjaminH

Registriert seit: 14. Okt 2004
Ort: Freiburg im Breisgau
713 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Dynamische Arrays, Optimierung des Zugriffs!?!?

  Alt 14. Jun 2005, 18:09
Wenn ich jetzt nix falsch verstehe, dann ist low(cVar.lVar) immer 0.
Also wird der Compiler die Schleife vermutlich eh optimieren(klick...) und das daraus machen:
Delphi-Quellcode:
 for high(cVar.lVar) downto 0 do
  [...]
und dadurch findet der abgleich mit dem wert von High(cVar.lVar) nicht jedesmal statt und dadurch wird auch nicht die Funktion nie aufgerufen...
qed, will ich mal hoffen

Grüße Benjamin

[Edit=Uuuups]Das ist ja .NET, ich hoffe das was ich hier erzähle gilt auch dafür !
Benjamin
  Mit Zitat antworten Zitat
Benutzerbild von Speedmaster
Speedmaster

Registriert seit: 4. Mär 2005
Ort: Karlsruhe
535 Beiträge
 
Delphi 2005 Personal
 
#3

Re: Dynamische Arrays, Optimierung des Zugriffs!?!?

  Alt 14. Jun 2005, 18:12
Zitat von BenjaminH:
Wenn ich jetzt nix falsch verstehe, dann ist low(cVar.lVar) immer 0.
Also wird der Compiler die Schleife vermutlich eh optimieren(klick...) und das daraus machen:
Delphi-Quellcode:
 for high(cVar.lVar) downto 0 do
  [...]
und dadurch findet der abgleich mit dem wert von High(cVar.lVar) nicht jedesmal statt und dadurch wird auch nicht die Funktion nie aufgerufen...
qed, will ich mal hoffen
Das hatte mich auch interresiert, aber wie gesagt die Frage war auch: Ob es besser ist eine Variable anzulegen wo immer drinsteht wie groß der Array ist, und man diese dann benutzt um das High einer Schleife rauszufinden!
Felix K.
Zitat:
Siehst du diesen Park da unten?
Jeden Tag lernen sich leute kennen und verlassen einander, und du hast dein ganzes Leben Zeit darin zu gehen!
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#4

Re: Dynamische Arrays, Optimierung des Zugriffs!?!?

  Alt 14. Jun 2005, 18:24
es wird optimiert
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#5

Re: Dynamische Arrays, Optimierung des Zugriffs!?!?

  Alt 14. Jun 2005, 19:21
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:
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--)
        {
            ...
        }
    }
}
Neben code prediction und anderen Spielereien gibt es bestimmte Typen, auf die der JIT ganz speziell reagiert.
Array gehört dazu. (Aber auch IList, IEnumerable, Attribute,...)
  Mit Zitat antworten Zitat
Benutzerbild von Speedmaster
Speedmaster

Registriert seit: 4. Mär 2005
Ort: Karlsruhe
535 Beiträge
 
Delphi 2005 Personal
 
#6

Re: Dynamische Arrays, Optimierung des Zugriffs!?!?

  Alt 14. Jun 2005, 19:37
Naja meine Frage war ja auch, ob es schneller ist eine VARIABLE anzulegen um dann es so zu machen:
for i:=low(MeinArray) to MaxVariable do
Felix K.
Zitat:
Siehst du diesen Park da unten?
Jeden Tag lernen sich leute kennen und verlassen einander, und du hast dein ganzes Leben Zeit darin zu gehen!
  Mit Zitat antworten Zitat
BenjaminH

Registriert seit: 14. Okt 2004
Ort: Freiburg im Breisgau
713 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Dynamische Arrays, Optimierung des Zugriffs!?!?

  Alt 14. Jun 2005, 20:22
Laut Brechi wird der Code optimiert, also wird diese Variable in der Schleife nie verwendet=> nein packe das nicht in eine Variable
Benjamin
  Mit Zitat antworten Zitat
Benutzerbild von Speedmaster
Speedmaster

Registriert seit: 4. Mär 2005
Ort: Karlsruhe
535 Beiträge
 
Delphi 2005 Personal
 
#8

Re: Dynamische Arrays, Optimierung des Zugriffs!?!?

  Alt 14. Jun 2005, 20:54
Zitat von BenjaminH:
Laut Brechi wird der Code optimiert, also wird diese Variable in der Schleife nie verwendet=> nein packe das nicht in eine Variable
So meinte ich das nicht, ich habe vielleicht das falsche Beispiel gebracht:

Anstatt SethLength(Vari,high(Vari)+1) zu setzen, SethLength(Vari,MeineVar+1) und dannach inc(MeineVar)
Felix K.
Zitat:
Siehst du diesen Park da unten?
Jeden Tag lernen sich leute kennen und verlassen einander, und du hast dein ganzes Leben Zeit darin zu gehen!
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#9

Re: Dynamische Arrays, Optimierung des Zugriffs!?!?

  Alt 14. Jun 2005, 21:26
Du machst dir Sorgen wegen ein paar kleineren Optimierungen und trotzdem verwendest du etwas in .Net, das .Net gar nicht kann?
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?

Ansonsten werfe ich das hier in den Raum: Why SetLength is evil
.Net ist einfach zu anders um dort genauso zu programmieren, wie man es vorher gewohnt war...
  Mit Zitat antworten Zitat
DevilsCamp
(Gast)

n/a Beiträge
 
#10

Re: Dynamische Arrays, Optimierung des Zugriffs!?!?

  Alt 28. Jun 2005, 14:48
Zitat von Robert_G:
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:
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--)
        {
            ...
        }
    }
}
Das liegt aber wohl eher daran, dass hier intern der Startwert immer nur vor dem ersten Lauf der Schleifen gesetzt wird und danach nicht mehr von Bedeutung ist. Die Abbruchbedingung selber ist in beiden Fällen eine Konstante.

Wenn du die beiden Schleifen auf Geschwindigkeit testen willst sollte es so aussehen:
Code:
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++)
        {
            ...
        }
    }
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.....)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:36 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz