Avatar billede atlanta Nybegynder
02. september 2002 - 21:42 Der er 13 kommentarer og
1 løsning

læsning og skrivning til txt filer via win api...

hey .. snakkede lige med en som mente at det ville værer næsten 2x så hurtigt at åbne, læse, gemme og lukke .. ved ikke lige det med at åbne og lukke dem men det med at læse og gemme hvis man brugte win api kald i stedet fir AssignFile - ReadLn - WriteLn - CloseFile ..

nu spørger jeg så er det rigti.. og hvad er api kaldene for så tester jeg det lige i mit timer program :D
Avatar billede hermandsen Juniormester
03. september 2002 - 00:08 #1
Lytter lige med! :)
Avatar billede cms Nybegynder
03. september 2002 - 00:15 #2
Altså Borland selv råder vist nok til at bruge AssignFile m.v.
Avatar billede cms Nybegynder
03. september 2002 - 00:15 #3
Dog er fordelen ved WinAPI-kaldene så vidt jeg ved at de benytter sig af Windows' systemcache. Så hvis filen lige har været læst vil den forblive i hukommelsen et stykke tid. Tror jeg
Avatar billede loke-liscom Nybegynder
03. september 2002 - 00:35 #4
Jeg har lige lavet et program der først henholdsvis skriver 100 Mb på med delphis rutiner og derefter skriver 100 Mb med Windows API rutinerne og foreskællen er minimal....

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    ProgressBar1: TProgressBar;
    ProgressBar2: TProgressBar;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  fil1 : file og byte;
  fil2 : integer;
  tmp : array of byte;
  Tid1,Tid2 : Double;
  i : integer;
begin
  SetLength(tmp,1024*1024);
  fillchar(tmp[1],1024*1024,200);

  Tid1 := now;
  AssignFile(fil1,'tmpfil1.tmp');
  ReWrite(Fil1,1);
  for i := 1 to 100 do
  begin
    BlockWrite(Fil1,tmp[1],Length(Tmp));
    ProgressBar1.Position := i;
  end;
  CloseFile(Fil1);
  Tid1 := now-Tid1;
  DeleteFile('tmpfil1.tmp');

  Tid2 := now;
  fil2 := FileCreate('tmpfil2.tmp');
  for i := 1 to 100 do
  begin
    FileWrite(Fil2,tmp[1],Length(Tmp));
    ProgressBar2.Position := i;
  end;
  FileClose(Fil2);
  Tid2 := now-Tid2;
  DeleteFile('tmpfil2.tmp');

  Tid1 := Tid1*24*60*60;
  Tid2 := Tid2*24*60*60;

  SetLength(tmp,0);
  Memo1.lines.add(format('Delphi fil rutiner          %3.3f sekunder',[Tid1]));
  Memo1.lines.add(format('Windows Api fil rutiner      %3.3f sekunder',[Tid2]));
end;

end.
Avatar billede loke-liscom Nybegynder
03. september 2002 - 00:38 #5
btw. cms det er klart at borland råder folk til at bruge AssignFile osv. da det så er muligt at kompilere det samme program i linux

/klaus
Avatar billede borrisholt Novice
03. september 2002 - 08:14 #6
brug Streams !

Kig på TfileStream ! You know the oo way !

Jens B
Avatar billede dcgeek Nybegynder
03. september 2002 - 16:30 #7
Placer en memo eller en RichEdit på din form + en Button.
I din Button1's OnClick skriver du:

memo1.lines.loadfromfile('fil.txt');

og hvis du skal gemme:
memo1.lines.savetofile('fil.txt');
Avatar billede borrisholt Novice
03. september 2002 - 16:33 #8
den bruger også streams
Avatar billede atlanta Nybegynder
03. september 2002 - 17:33 #9
ja men mit prob er at jeg har en logfil på et sted mellem 4 og 10mb der skal læses ind og omskrives.. i et console program.. så jeg er ude på at finde den hurtigste metode til at 1 læse min logfil og 2 skrive den ommodifiserede log

så en memo kan jeg ikke bruge til meget.. men, er den FIleSTream så meget hurtigere.. eller kan det bedre betale sig at bruge de winapi kald som cms mener bliver cashed??

skal nok også lige sige så at jeg læse en linie af gangen fra min log og ligesom parser den og så går jeg videre..
Avatar billede atlanta Nybegynder
03. september 2002 - 17:38 #10
loke: prøvede lige din kode igennem.. og med de 100mb er der altså stadig en væsentlig forskel..

Delphi fil rutiner          17,405 sekunder
Windows Api fil rutiner      8,813 sekunder

8,5 sekunder kan man jo stadig se som en forbedrelse af min kode :D
Avatar billede atlanta Nybegynder
03. september 2002 - 18:00 #11
Loke-liscom; vi kan nok godt blive enige om at der ikke er den storer forskel egentlig.. i det lange løb er de jo nogen lunde lige hurtige

Delphi fil rutiner          5,207 sekunder
Windows Api fil rutiner      9,003 sekunder
/// temmelig lang pause \\\
Delphi fil rutiner          16,844 sekunder
Windows Api fil rutiner      4,787 sekunder
Delphi fil rutiner          4,486 sekunder
Windows Api fil rutiner      5,578 sekunder
Delphi fil rutiner          6,850 sekunder
Windows Api fil rutiner      4,326 sekunder
Delphi fil rutiner          7,300 sekunder
Windows Api fil rutiner      4,477 sekunder
/// lille pause  \\\
Delphi fil rutiner          10,185 sekunder
Windows Api fil rutiner      13,029 sekunder
Delphi fil rutiner          4,516 sekunder
Windows Api fil rutiner      4,617 sekunder
///Pause på en 20 min \\\
Delphi fil rutiner          5,017 sekunder
Windows Api fil rutiner      4,887 sekunder
///Resten er kørt lige efter hinanden\\\
Delphi fil rutiner          4,636 sekunder
Windows Api fil rutiner      4,507 sekunder
Delphi fil rutiner          4,456 sekunder
Windows Api fil rutiner      4,647 sekunder
Delphi fil rutiner          4,547 sekunder
Windows Api fil rutiner      4,396 sekunder
Delphi fil rutiner          4,406 sekunder
Windows Api fil rutiner      4,557 sekunder
Avatar billede borrisholt Novice
04. september 2002 - 08:16 #12
TFileStream bygger på Windows API kald WriteFile !

Jens B
Avatar billede atlanta Nybegynder
04. september 2002 - 15:57 #13
nice..

mange tak borris.. også tak til jer andre og specielt loke.. havde sq ikke lige selv tænkt på at lave sådan en "benchmark" :D
Avatar billede loke-liscom Nybegynder
05. september 2002 - 12:20 #14
Selv tak, det var rart at jeg kunne hjælpe....
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester