Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Welcher Ablauf ist schneller bei WriteBuffer? (https://www.delphipraxis.net/77509-welcher-ablauf-ist-schneller-bei-writebuffer.html)

Helmi 20. Sep 2006 15:30


Welcher Ablauf ist schneller bei WriteBuffer?
 
Hallo Jungs,

ich hab mir grad mal wieder einen Code eines Programmes angeschaut, den ich schon vor längerem mal programmiert habe und da ist mir ein Teil aufgefallen, der mir vielleicht mal Probs bereiten könnte:

Delphi-Quellcode:
      try
        FileStream := TFileStream.Create(drive_MonitorLog, fmOpenReadWrite);

        with FileStream, ListView_CallingList do
          begin
            //ListView auslesen und zu einem String hinzufügen
            for i2 := 0 to Pred(i) do
              begin
                S_List := S_List +
                          Items.Item[i2].SubItems.Strings[2] + ', ' + //Datum
                          Items.Item[i2].SubItems.Strings[3] + ', ' + //Uhrzeit
                          Items.Item[i2].Caption            + ', ' + //Name
                          Items.Item[i2].SubItems.Strings[0] + ', ' + //Nummer
                          Items.Item[i2].SubItems.Strings[1] + ', ' + //Ort
                          Items.Item[i2].SubItems.Strings[4] + #13#10;//MSN
              end;

            //FileStream-Position = FileStream-Größe
            Position := Size;

            //In die vorhandene Datei "Monitor.log" schreiben
            WriteBuffer(S_List[1], Length(S_List));
          end;
      finally
        //FileStream freigeben und löschen
        FreeAndNil(FileStream);
      end;
Jetzt schreib ich ja zuerst alles in einen String und schreib dann diesen String mit "WriteBuffer" in die Datei.

Jetzt hätt ich mir vorgestellt, dass es auch so ginge und das dies schneller sei:
Delphi-Quellcode:
      try
        FileStream := TFileStream.Create(drive_MonitorLog, fmOpenReadWrite);

        with FileStream, ListView_CallingList do
          begin
            //ListView auslesen und zu einem String hinzufügen
            for i2 := 0 to Pred(i) do
              begin
                S_List := Items.Item[i2].SubItems.Strings[2] + ', ' + //Datum
                          Items.Item[i2].SubItems.Strings[3] + ', ' + //Uhrzeit
                          Items.Item[i2].Caption            + ', ' + //Name
                          Items.Item[i2].SubItems.Strings[0] + ', ' + //Nummer
                          Items.Item[i2].SubItems.Strings[1] + ', ' + //Ort
                          Items.Item[i2].SubItems.Strings[4] + #13#10;//MSN

                //FileStream-Position = FileStream-Größe
                Position := Size;
   
                //In die vorhandene Datei "Monitor.log" schreiben
                WriteBuffer(S_List[1], Length(S_List));              
              end;
          end;
      finally
        //FileStream freigeben und löschen
        FreeAndNil(FileStream);
      end;
(ungetestet)

Denn so schreib ich nicht erst alles in einen String, sondern gleich in die Datei.

Welche Möglichkeit ist schneller?

marabu 20. Sep 2006 15:49

Re: Welcher Ablauf ist schneller bei WriteBuffer?
 
Ich denke, es ist egal welchen der beiden Codes du nimmst.

PS: nach mehrmaligem Lesen habe ich den Unterschied nun doch noch entdeckt. Tendenziell (für wachsendes i) ist der zweite Code schneller. Noch schneller wird das ganze vielleicht, wenn du ganz auf die String-Montage verzichtest und die einzelnen Strings gleich wegschreibst. Über welche Werte für i reden wir hier? Und denke an die golden rule: never change a running system.

Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:18 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