AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Eine Frage der Performance - T(Object)List oder Dyn. Array?

Eine Frage der Performance - T(Object)List oder Dyn. Array?

Ein Thema von Mithrandir · begonnen am 11. Mai 2009 · letzter Beitrag vom 19. Mai 2009
Antwort Antwort
Seite 3 von 5     123 45   
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.029 Beiträge
 
Delphi XE3 Enterprise
 
#21

Re: Eine Frage der Performance - T(Object)List oder Dyn. Arr

  Alt 12. Mai 2009, 10:42
Dictonaries sind wirklich eine feine Sache und halten sich auch bei großen Datenräumen gut. Habe damit schon 10000 * 10000 Arrays gehabt und das ganze lief ordentlich. Es findet sich dazu auch einiges in der DP:

1. Dictonary von r2c2
2. Dictornary von alzaimer auch für NET.
3. der Zeitvergleich von alzaimer, der es auf den Punkt bringt.
Martin Schaefer
Phaeno
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#22

Re: Eine Frage der Performance - T(Object)List oder Dyn. Arr

  Alt 12. Mai 2009, 11:17
Hmm, TIntegerDictionary von alzaimar klingt doch nach dem, was ich bräuchte. Ich mein mich auch dran erinnern zu können, dass ich schonmal darüber gestolpert bin, es kam mir zumindest bekannt vor. Aber damals habe ich das noch nicht so ganz gerallt..

Mal zur praktischen Umsetzung und der Verwendung von Pointern (Gott, is das alles lange her.. ) folgendes Listing:

Delphi-Quellcode:
var
  Dict: TIntegerDictionary;

implementation

{... Create, Dict initialisieren, etc ...}

procedure AddNode(Node: TORPNode);
begin
  Dict.Add(Node.ID, @Node);
end;

function ReadNode(ID: Cardinal): TORPNode;
begin
  Dict.Find(ID, Result^);
end;
Ist jetzt nur ohne Test grob zusammengehackt. Wenn ich jetzt einen Eintrag lösche, was passiert dann mit den Daten, die hinter dem Pointer liegen? Muss ich mich selbst darum kümmern? Sollte ich denn weiter auf der Schiene fahren, alles in Objekte zu fassen, oder sollte ich doch lieber Records verwenden? Fragen über Fragen...
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#23

Re: Eine Frage der Performance - T(Object)List oder Dyn. Arr

  Alt 12. Mai 2009, 12:54
Zitat von Daniel G:
Wie Hansa schon erwähnte, ein Link auf irgendeine Beispielimplementation (kann auch C# sein) wäre super.
Ein C# Beispiel für ein Dictionary?

Hab ich da:
Code:
var MyDict = new Dictionary<TKey, TValue>();


Für TKey und TValue die entsprechenden Typen einsetzen - in deinem Fall also wohl sowas:
Code:
var MyDict = new Dictionary<uint, Node>(1000000);
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#24

Re: Eine Frage der Performance - T(Object)List oder Dyn. Arr

  Alt 12. Mai 2009, 13:00
Moah, so war das jetzt nicht gemeint..

Konnt ja nicht ahnen, dass C# sowas schon kann...
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#25

Re: Eine Frage der Performance - T(Object)List oder Dyn. Arr

  Alt 12. Mai 2009, 18:17
Deine Umsetzung aus #22 funktioniert so nicht, da der Zeiger auf den Stack verweist. Wenn du noch mit Records arbeitest, solltest du dir mit New einen neuen Record besorgen und dann kopieren, wenn TORPNode eine Klasse sein sollte, kannst du einfach nach Pointer casten.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#26

Re: Eine Frage der Performance - T(Object)List oder Dyn. Arr

  Alt 14. Mai 2009, 21:58
Zitat von Apollonius:
...kannst du einfach nach Pointer casten.
Hi,

Das habe ich nicht ganz verstanden. Sollte ich mir dann so einen Typ definieren:

PORPNode = ^TORPNode; Und den dann stattdessen in Dict.Add nutzen?
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#27

Re: Eine Frage der Performance - T(Object)List oder Dyn. Arr

  Alt 14. Mai 2009, 23:13
Nein, du kannst jede Referenz auf ein Objekt als Pointer interpretieren, eben mit einem Cast:
Dict.Add(Pointer(TORPNode.Create));
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#28

Re: Eine Frage der Performance - T(Object)List oder Dyn. Arr

  Alt 15. Mai 2009, 13:03
Ok, danke.

Allerdings habe ich das irgendwie noch nicht ganz auf der Reihe. Folgender Ablauf:

Der Node wird erstellt:

Delphi-Quellcode:
fORPNode := TORPNode.Create;
fORPNode.Subnodes := TObjectList.Create;
Anschließend wird er über eine Schleife mit Daten gefüllt:

Delphi-Quellcode:
       
       if fRegAttrExpr.Match then
          repeat
            case AnsiIndexText(fRegAttrExpr.SubExpressions[1], AllOSMElements) of

              ATTR_ID:
                begin
                  fORPNode.ID := StrToInt(fRegAttrExpr.SubExpressions[3]); //Hier steht dann z.B. 123456
                end;

              ATTR_LAT:
                begin
                  fORPNode.MercLat := StrToFloat(fRegAttrExpr.SubExpressions[3]); //Hier bspw. 53,45356645
                end;

              ATTR_LON:
                begin
                  fORPNode.MercLon := StrToFloat(fRegAttrExpr.SubExpressions[3]); //Hier bspw. 8,8234554
                end;

            end;
          until not fRegAttrExpr.MatchAgain;
Dann wird das Object zum TIntegerDictionary zugefügt:

Delphi-Quellcode:
  procedure TORPTree.AddNodeToList(Node: TORPNode);
  begin
    fNodes.Add(Node.ID, Pointer(Node));
  end;
Jetzt muss ich das Objekt wieder auslesen. Das geschieht so:

Delphi-Quellcode:
        var
ptr: Pointer;

{...}

ATTR_REF:
                  begin
                    if fORPTree.Nodes.Find(StrToInt(fRegAttrExpr.SubExpressions[3]), ptr) then
                    begin
                      fORPSubNd := TORPNode(ptr^);
                      fORPWay.SubNodes.Add(fORPSubNd);
                    end;
In fRegAttrExpr.SubExpressions[3] steht laut Debugger "20958823". Wenn ich mir jetzt im Debugger fORPSubNd anzeigen lasse, dann sieht das z.B: so aus:

Code:
fORPSubNd.ID = 1685016144
fORPSubNd.MercLat = 2,4587345897e-307
fORPSubNd.MercLon = 0
Der Eintrag wurde aber mit der o.g. genannten ID in der TIntegerDictionary gefunden, sonst wäre er ja nicht in den IF-Block gesprungen. Und theoretisch sollte in ID genau dieser Wert (20958823) stehen.

Was mache ich falsch?

P.S.: Ich vermute ja, ich schieße mit den Pointern falsch um mich. Aber eigentlich sieht das für mich ganz logisch aus.
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#29

Re: Eine Frage der Performance - T(Object)List oder Dyn. Arr

  Alt 15. Mai 2009, 13:50
Caste mal nicht nach Pointer sondern nach Cardinal oder Integer - ich glaube die speicherst einen Pointer, der nach verlassen der Funktion ungültig wird ...
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#30

Re: Eine Frage der Performance - T(Object)List oder Dyn. Arr

  Alt 15. Mai 2009, 13:58
Ähm... Wie jetzt genau? Soll ich sowas schreiben:

Delphi-Quellcode:
procedure TORPTree.AddNodeToList(Node: TORPNode);
  begin
    fNodes.Add(Node.ID, Cardinal(Node));
  end;
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 11:12 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