Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Firebird + ZEOS: Erste query langsam (https://www.delphipraxis.net/152860-firebird-zeos-erste-query-langsam.html)

blackfin 9. Jul 2010 15:58

Datenbank: Firebird • Version: 2.1.3 embedded • Zugriff über: ZEOS

Firebird + ZEOS: Erste query langsam
 
Hallo liebe Experten,

Mir kommt etwas in Firebird Embedded + ZEOS etwas komisch vor:
Die erste Query dauert immer extrem lange, nämlich bis zu 10x so lange wie eine darauffolgende Query.
Das merkwürdige daran ist, dass es egal ist, ob ich als erste Query von einem komplett anderen table Selektert habe als bei der zweiten Query,
dann ist die zweite Query trotzdem schneller.

Beispiel:

Code:
'SELECT * FROM foo'
=> Ausführungszeit: 11 ms

danach nochmal:
Code:
'SELECT * FROM foo'
=> Ausführungszeit: 1 ms

Das kann ich jetzt noch mit einem Firebird internen Cache erklären.
ABER das folgende nicht:

--Programm-Neustart--

Code:
'SELECT * FROM bar'
=> Ausführungszeit: 12ms

danach:

Code:
'SELECT * FROM foo'
=> Ausführungszeit: 1 ms


Das verwirrt mich. Ist das ein Bug in ZEOS? Hat jemand schon ähnliche Erfahrungen damit gemacht?

mirage228 9. Jul 2010 20:06

AW: Firebird + ZEOS: Erste query langsam
 
Also bei 10ms würde ich ja fast schon von einer Messungenauigkeit des Timers sprechen... Womit hast Du gemessen?

Bernhard Geyer 9. Jul 2010 21:28

AW: Firebird + ZEOS: Erste query langsam
 
Wenn nur 10 ms sind - gähn.
Hier werden wohl bei der ersten Query interne Caches etc. aufgebaut. Und solche Caches etc. sind nicht unbedingt Tabellenspezifisch.

mkinzler 9. Jul 2010 21:30

AW: Firebird + ZEOS: Erste query langsam
 
Oder Zeos baut die Verbindung zum Server erst zu diesem Zeitpunkt auf

blackfin 9. Jul 2010 21:38

AW: Firebird + ZEOS: Erste query langsam
 
Zitat:

Also bei 10ms würde ich ja fast schon von einer Messungenauigkeit des Timers sprechen... Womit hast Du gemessen?
Die Messroutine sieht folgendermaßen aus:

Delphi-Quellcode:

procedure CalibrateCPU() ;
var
 t,t2 : Int64 ;
begin
  t := GetTickCount;
  while t=GetTickCount do;
  t2 := GetCPUTicks;
  while GetTickCount<(t+400) do;
  t2 := GetCPUTicks - t2;
  CPUClock := 2.5e-6*t2;
end;

// CPU Cycles Count
function GetCPUTicks: Int64;
asm
   DB $0F,$31
end;

// Start Time Measurement
procedure StartGetTime() ;
begin
    ticks := GetCPUTicks() ;
end ;


// End Time Measurement
function EndGetTime(const InMilliSeconds: boolean = true) : OleVariant ;
var
  ticks2 : Int64 ;
begin
    ticks2 := GetCPUTicks() - ticks;
    if not InMilliSeconds then
      Result := ticks2 / CPUClock
    else
    Result := FloatToStrF((ticks2 / CPUClock) / 1000,fffixed,15,1) ;
end;
Beim Programmstart wird einmal CalibrateCPU() ausgeführt, und dann vor der Query ein StartGetTime() und direkt nach der Query ein EndGetTime(); ausgeführt.




Zitat:

Wenn nur 10 ms sind - gähn.
Hast eigentlich recht, aber das kann für mein Vorhaben u.U. doch relevant sein..naja egal :)

Zitat:

Oder Zeos baut die Verbindung zum Server erst zu diesem Zeitpunkt auf
Es gibt keinen "Server", ist ja embedded. Und das "connect" zur Datei passiert definitiv schon vorher.

Stevie 13. Jul 2010 10:50

AW: Firebird + ZEOS: Erste query langsam
 
Deine Methode der Zeitmessung ist sowieso schrecklich ungenau. (Abweichungen von ~3%, hab einfach in ner Schleife nen Sleep(100) gemessen)
Warum nicht QueryPerformanceCounter?

blackfin 13. Jul 2010 11:29

AW: Firebird + ZEOS: Erste query langsam
 
sleep() ist selbst ungenau und gearantiert nur, dass mindestens diese Zeit gewartet wird, kann aber auch etwas länger sein :)

Aber mal sehen, den Performance-Counter probiere ich auch mal aus!
Obwohl mir die Abweichung der Zeitmessung von ~3-4% eigentlich in diesem Fall egal ist, denn es geht bei meinem Problem um viel grössere Dimensionen als diese minimale Abweichung von ~3% bei der Query-Ausführung, nämlich um den Ausführungs-Faktor 10 oder mehr :)

Edit:
Der Thread kann als geschlossen betrachtet werden, ich werde erstmal selbst ein paar Dinge ausprobieren.

Stevie 13. Jul 2010 11:51

AW: Firebird + ZEOS: Erste query langsam
 
Zitat:

Zitat von blackfin (Beitrag 1035077)
sleep() ist selbst ungenau und gearantiert nur, dass mindestens diese Zeit gewartet wird, kann aber auch etwas länger sein :)

Richtig, wenn das System nicht sofort Rechenzeit zur Verfügung stellt.
In meinem Test war das aber nicht ausschlaggebend. Mir gings nur um den Vergleich deiner Methode und TStopwatch (neu in Delphi 2010 in der Unit Diagnostics, ist aber nix anderes als nen angenehm zu nutzender Wrapper für QueryPerformanceCounter)


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:16 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 by Thomas Breitkreuz