![]() |
AW: Vergleich Firebird: C# vs. Delphi Win32
wie gesagt, das war nur eine Testanwendung ;) Die eigentliche Anwendung ist natürlich sauberer...
Zu euren Vorschlägen: Mit Strg + F5 läuft das ganze schon wesentlich schneller! Das war anscheinend das Kernproblem... :-) Jetzt bin ich mit 10000 Datensätze bei ziemlich genau 4 Sekunden. Ich denke das reicht soweit. Delphi braucht bei entsprechendem Code nun ca. 2,2 Sekunden. Vielen Dank :) |
AW: Vergleich Firebird: C# vs. Delphi Win32
Zitat:
|
AW: Vergleich Firebird: C# vs. Delphi Win32
Hast du da zufällig einen Tipp wie ich das machen könnte?
Klar, irgendwann wird das in einen Thread ausgelagert, aber von der Ausführungszeit sollte das doch noch keinen Unterschied machen... Die Schleife sieht nun so aus:
Code:
wüsste nicht, was ich da noch optimieren könnte...
const int max = 10000; // < Anzahl
for (int i = 0; i < max; i++) { // Werte den Parametern zuweisen Cmd.Parameters["Par1"].Value = i; Cmd.Parameters["Par2"].Value = i; Cmd.Parameters["Par3"].Value = "Test"; Cmd.Parameters["Par4"].Value = DateTime.Now; // Command durchführen Cmd.ExecuteNonQuery(); // Nach jeweils 3000 Datensätz die Transaktion "committen" if ((i % 3000) == 0) Trans.CommitRetaining(); } |
AW: Vergleich Firebird: C# vs. Delphi Win32
Zitat:
Der Indexer-Zugriff auf den Parameter muss nicht innerhalb der Schleife passieren, weil das jedesmal ein Loopup ist. Das reicht wenn man den ein einziges mal macht, und nicht 40.000 mal :)
Code:
Alternativ kannst Du Dir die Referenzen auf die Parameter auch gleich beim Erzeugen der Parameter merken, dann sparst Du Dir die 4 Lookups zu Beginn auch nochmal, da wär allerdings wirklich mikrooptimierung.
var param1 = Cmd.Parameters["Par1"];
var param2 = Cmd.Parameters["Par2"]; var param3 = Cmd.Parameters["Par3"]; var param4 = Cmd.Parameters["Par4"]; const int max = 10000; // < Anzahl for (int i = 0; i < max; i++) { // Werte den Parametern zuweisen param1.Value = i; param2.Value = i; param3.Value = "Test"; param4.Value = DateTime.Now; // Command durchführen Cmd.ExecuteNonQuery(); // Nach jeweils 3000 Datensätz die Transaktion "committen" if ((i % 3000) == 0) Trans.CommitRetaining(); } |
AW: Vergleich Firebird: C# vs. Delphi Win32
@Morphie: Wird nicht mehr so viel bringen, aber anstatt CommitRetaining ein normales Commit machen. Somit ist es aus Sicht von Firebird keine langlaufende Transaktion und die OIT/OAT kann nachziehen.
|
AW: Vergleich Firebird: C# vs. Delphi Win32
Danke =)
Beide Tipps zusammen bringen ca. 100ms bei 10.000 DS. So lasse ich es nun erstmal denke ich... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:13 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