AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Performancefrage für ein einfaches Matching
Thema durchsuchen
Ansicht
Themen-Optionen

Performancefrage für ein einfaches Matching

Ein Thema von fisipjm · begonnen am 13. Jun 2022 · letzter Beitrag vom 15. Jun 2022
Antwort Antwort
Seite 2 von 2     12   
fisipjm

Registriert seit: 28. Okt 2013
299 Beiträge
 
#11

AW: Performancefrage für ein einfaches Matching

  Alt 14. Jun 2022, 08:51
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:
ThirdPartyComponent.Select('Select Feldname From Tabelle');
ThirdPartyComponent.GetFieldvalue('Feldname');
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.

Das Olevariant Array muss ich nun eben mit Olevariant[Spaltennummer,Zeilennummer] aufrufen.

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

Ich hoffe damit wird klarer was ich versuche zu erreichen.
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.445 Beiträge
 
Delphi 11 Alexandria
 
#12

AW: Performancefrage für ein einfaches Matching

  Alt 14. Jun 2022, 14:36
Klarer ja, klar genug zweifelhaft.
Ich bin mir aber sicher dass für den Geschwindigkeitsnachteil das SQL schuld ist und nicht das TDictionary.
  Mit Zitat antworten Zitat
fisipjm

Registriert seit: 28. Okt 2013
299 Beiträge
 
#13

AW: Performancefrage für ein einfaches Matching

  Alt 14. Jun 2022, 15:28
Klarer ja, klar genug zweifelhaft.
Ich bin mir aber sicher dass für den Geschwindigkeitsnachteil das SQL schuld ist und nicht das TDictionary.
Nö, der SQL Server ist nicht Teil der Geschwindigkeitsmessung. Die beginnt erst nachdem die Daten schon abgeholt wurden.
Welche infos fehlen noch um an ein klar genug ran zu kommen?
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.016 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#14

AW: Performancefrage für ein einfaches Matching

  Alt 14. Jun 2022, 15:35
Liest sich ähnlich zu der FieldByName Problematik, wenn man das in einer Schleife immer benutzt anstatt vor der Schleife einmal die Felder über FieldByName zu holen, um dann darauf zuzugreifen.

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.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#15

AW: Performancefrage für ein einfaches Matching

  Alt 14. Jun 2022, 16:17
Liest sich ähnlich zu der FieldByName Problematik, wenn man das in einer Schleife immer benutzt anstatt vor der Schleife einmal die Felder über FieldByName zu holen, um dann darauf zuzugreifen.
Das ist aber mittlerweile auch nicht mehr ganz so problematisch wie früher, seitdem das über ein Dictionary realisiert wird.
Delphi-Quellcode:
function TFields.FindField(const FieldName: string): TField;
begin
  FDict.TryGetValue(AnsiLowerCase(FieldName), Result);
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#16

AW: Performancefrage für ein einfaches Matching

  Alt 14. Jun 2022, 16:46
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.016 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#17

AW: Performancefrage für ein einfaches Matching

  Alt 14. Jun 2022, 16:54
Das ist aber mittlerweile auch nicht mehr ganz so problematisch wie früher, seitdem das über ein Dictionary realisiert wird.
Sind aber trotzdem bei 4181 Zeilen mit 2 Feldern 8360 unnütze Aufrufe. Die Quintessenz des Threads hier war bisher die Frage "wie bekomm ich das matching schneller" und ich hab einfach in den Raum gestellt "mach es nicht schneller, sondern lass es weg".

P.S. Bei dem AnsiLowerCase 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.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (14. Jun 2022 um 16:57 Uhr)
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.445 Beiträge
 
Delphi 11 Alexandria
 
#18

AW: Performancefrage für ein einfaches Matching

  Alt 15. Jun 2022, 07:32
Klarer ja, klar genug zweifelhaft.
Ich bin mir aber sicher dass für den Geschwindigkeitsnachteil das SQL schuld ist und nicht das TDictionary.
Nö, der SQL Server ist nicht Teil der Geschwindigkeitsmessung. Die beginnt erst nachdem die Daten schon abgeholt wurden.
Welche infos fehlen noch um an ein klar genug ran zu kommen?
Deine Aussage "Werfe ich jetzt in die SQL Abfrage noch ein 2. Feld rein dann wird aus der 1ms schon 50ms usw." lies mich zum Schluß kommen dass da was mit SQL dabei ist.
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.
  Mit Zitat antworten Zitat
fisipjm

Registriert seit: 28. Okt 2013
299 Beiträge
 
#19

AW: Performancefrage für ein einfaches Matching

  Alt 15. Jun 2022, 08:49
Klarer ja, klar genug zweifelhaft.
Ich bin mir aber sicher dass für den Geschwindigkeitsnachteil das SQL schuld ist und nicht das TDictionary.
Nö, der SQL Server ist nicht Teil der Geschwindigkeitsmessung. Die beginnt erst nachdem die Daten schon abgeholt wurden.
Welche infos fehlen noch um an ein klar genug ran zu kommen?
Deine Aussage "Werfe ich jetzt in die SQL Abfrage noch ein 2. Feld rein dann wird aus der 1ms schon 50ms usw." lies mich zum Schluß kommen dass da was mit SQL dabei ist.
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.
Ja, dass stimmt wohl Die CodeRage Beiträge gestern waren wieder erste Sahne
Ihr habt das Problem schon recht gut erkannt. Den Index Weg lassen ist natürlich am schnellsten, aber geht halt auf die "Bequemlichkeit".
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   

 

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 23:31 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