![]() |
AW: Performancefrage für ein einfaches Matching
Okay,
zunächst mal Sorry für den geringen Informationsgehalt. Ich versuch mal ein bischen Licht ins dunkel zu bringen. Die Funktion welche ich aktuell versuche zu optimieren gibt es eigentlich schon. Wir setzen eine Komponente in Delphi ein um auf einen Applikationsserver eines Drittherstellers zuzugreifen, der wiederrum auf eine MSSQL geht. Dort gibt es eine Funktion zum Feldwerte lesen. Der Aufruf funktioniert grob so:
Delphi-Quellcode:
Ich hab jetzt durch Zufall herausgefunden, dass der Aufruf des Herstellers sich einen Fuß ins Ohr schafft. zu dem Zeitpunkt wo ich den Feldwert aufrufen kann, liegt mir nämlich eigentlich schon das gesamte Ergebnis der ganzen Abfrage als 2 Dimensionales OleVariant Array vor. Beim Aufruf der GetFieldvalue Funktion wird der Wert nochmal auf der Applikationsschicht abgefragt, allerdings nicht in der DB sondern nur in einem internen Cache. Also auch kein Vorteil zum Thema Datenaktualität.
ThirdPartyComponent.Select('Select Feldname From Tabelle');
ThirdPartyComponent.GetFieldvalue('Feldname'); Das Olevariant Array muss ich nun eben mit
Delphi-Quellcode:
aufrufen.
Olevariant[Spaltennummer,Zeilennummer]
Aufrufzeit für einen Feldwert mit 4181 Zeilen = 4310ms (Komponentenfunktion) Aufrufzeit für einen Feldwert mit 4181 Zeilen = 1ms (eigene Funktion) soweit ja schon mal subi :-) Werfe ich jetzt in die SQL Abfrage noch ein 2. Feld rein dann wird aus der 1ms schon 50ms usw. Das liegt halt daran, dass ich die Komponente gerne kapseln will um nicht den Index aufrufen zu müssen, sondern weiter den Feldwert benutzen kann. Welchen Index der Feldwert hat schreib ich mir also einmalig beim ersten aufruf in das Dictionary und kann dann später in meiner funktion mit der gleichen Sytax den Feldwert wieder mit Namen aufrufen. Das Suchen scheint aber eben mit jedem Eintrag im Dictionary entsprechend länger zu dauern. Das wollte ich gerne ein bisschen einbremsen :-D Ich hoffe damit wird klarer was ich versuche zu erreichen. |
AW: Performancefrage für ein einfaches Matching
Klarer ja, klar genug zweifelhaft.
Ich bin mir aber sicher dass für den Geschwindigkeitsnachteil das SQL schuld ist und nicht das TDictionary. |
AW: Performancefrage für ein einfaches Matching
Zitat:
Welche infos fehlen noch um an ein klar genug ran zu kommen? |
AW: Performancefrage für ein einfaches Matching
Liest sich ähnlich zu der
Delphi-Quellcode:
Problematik, wenn man das in einer Schleife immer benutzt anstatt vor der Schleife einmal die Felder über FieldByName zu holen, um dann darauf zuzugreifen.
FieldByName
Wie macht man Dinge schneller? Man vermeidet redundante Arbeit - in diesem Fall das ermitteln des Indexes per Name indem man es einmal vor der Schleife macht. |
AW: Performancefrage für ein einfaches Matching
Zitat:
Delphi-Quellcode:
function TFields.FindField(const FieldName: string): TField;
begin FDict.TryGetValue(AnsiLowerCase(FieldName), Result); end; |
AW: Performancefrage für ein einfaches Matching
Zum Glück setzt dieses TDictionary<K,V> das Value auch dann, wenn nichts gefunden wurde, sonst wäre das Result von FindField nicht initialisiert, weil niemand das Result vom TryGetValue auswertet. :stupid:
|
AW: Performancefrage für ein einfaches Matching
Zitat:
P.S. Bei dem
Delphi-Quellcode:
anstatt eines case insensitiven EqualityComparers (und ich mein nicht den aus System.Generics.Defaults, der ist nämlich auch Schrott, da er nix anderes als AnsiLowerCase macht) dreht sich mir übrigens der Magen um.
AnsiLowerCase
|
AW: Performancefrage für ein einfaches Matching
Zitat:
Wie die Kollegen hier auf FieldByName kommen erschließt sich mir nicht. Wenn denen das klar ist reicht das ja. Kompetentere wie z.B. Uwe und Stevie lassen sich eh nicht finden. ;-) |
AW: Performancefrage für ein einfaches Matching
Zitat:
Ihr habt das Problem schon recht gut erkannt. Den Index Weg lassen ist natürlich am schnellsten, aber geht halt auf die "Bequemlichkeit". |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:04 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