![]() |
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:
=> Ausführungszeit: 11 ms
'SELECT * FROM foo'
danach nochmal:
Code:
=> Ausführungszeit: 1 ms
'SELECT * FROM foo'
Das kann ich jetzt noch mit einem Firebird internen Cache erklären. ABER das folgende nicht: --Programm-Neustart--
Code:
=> Ausführungszeit: 12ms
'SELECT * FROM bar'
danach:
Code:
=> Ausführungszeit: 1 ms
'SELECT * FROM foo'
Das verwirrt mich. Ist das ein Bug in ZEOS? Hat jemand schon ähnliche Erfahrungen damit gemacht? |
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?
|
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. |
AW: Firebird + ZEOS: Erste query langsam
Oder Zeos baut die Verbindung zum Server erst zu diesem Zeitpunkt auf
|
AW: Firebird + ZEOS: Erste query langsam
Zitat:
Delphi-Quellcode:
Beim Programmstart wird einmal CalibrateCPU() ausgeführt, und dann vor der Query ein StartGetTime() und direkt nach der Query ein EndGetTime(); ausgeführt.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; Zitat:
Zitat:
|
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? |
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. |
AW: Firebird + ZEOS: Erste query langsam
Zitat:
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