AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte RtlVclOptimize 2.77 - DelphiSpeedUp Code im eigenen Programm
Thema durchsuchen
Ansicht
Themen-Optionen

RtlVclOptimize 2.77 - DelphiSpeedUp Code im eigenen Programm

Ein Thema von jbg · begonnen am 8. Mai 2007 · letzter Beitrag vom 7. Mai 2008
Antwort Antwort
Seite 4 von 5   « Erste     234 5      
jbg
Registriert seit: 12. Jun 2002
Ich hatte eigentlich vor an den Delphi Tagen 2007 eine Unit mit den Optimierungen von DelphiSpeedUp vorzustellen. Jedoch kam mir etwas dazwischen, wodurch ich nicht an den Delphi Tagen 2007 teilnehmen konnte und auch keine Zeit hatte, diese Unit für die Öffentlichkeit aufzubereiten.

Wer also schon immer mal die Optimierungen aus DelphiSpeedUp in seinem eigenen Programmen haben wollte, kann sich nun die RtlVclOptimize.pas Unit herunterladen und sie in seine Projekte einbinden.


Installationsanleitung
  • 1. Entpacken der RtlVclOptimize.zip in einen beliebigen Ordner.
  • 2. Die Unit zum Delphi-Projekt hinzufügen. Am besten recht weit oben in der uses-Liste, da dadurch bereits die initialization-Abschnitte der andere Units auf die schnelleren Funktionen zugreifen.
Was gibt es zu beachten
  • Die Unit muss in der EXE-Datei stecken und nicht in einem Package. Denn würde das Package entladen, könnte man sich vor den auftretenden Zugriffsverletzungen nicht retten, weil die Funktionen auf die die original-RTL Funktionen umgeleitet werden, nicht mehr im Speicher sind.
Was ist RtlVclOptimize.pas nicht, bzw. was fehlt im Vergleich zu DelphiSpeedUp
  • Die Unit ist nicht die FastCode Library. Diese muss extra heruntergeladen werden, wenn man deren RTL-Optimierungen zusätzlich nutzen will.
  • FastObj ist nicht enthalten
  • Sämtliche nur für die IDE interessante Optimierungen fehlen
Lizenz
  • Die Unit steht unter der MPL 1.1. Darf also auch in kommerziellen/closed-source Anwendungen eingesetzt werden
Angehängte Dateien
Dateityp: zip rtlvcloptimize277_139.zip (21,3 KB, 263x aufgerufen)
 
jbg

 
Delphi 10.1 Berlin Professional
 
#31
  Alt 3. Okt 2007, 14:50
Zitat von mirage228:
Es sei denn es gibt noch mehr Fehler die GetLastError in dem Fall liefern könnte...
Das weiß wohl nur Microsoft. Wieso muss eigentlich GetFileAttributes schief gehen, wenn die Datei gesperrt ist. Ich will sie ja nicht öffnen. Aber das werden wir wohl nie erfahren.
Andreas aka AHUser aka jbg
  Mit Zitat antworten Zitat
jbg

 
Delphi 10.1 Berlin Professional
 
#32
  Alt 3. Okt 2007, 15:00
Das mit ACCESS_DENIED ist so eine Sache. Wenn man auf ein Verzeichnis zugreift, auf das man keine Leserechte hat, bekommt man auch ein Access Denied zurück.

Also wenn man auf die Datei 'C:\Gesperrt\NichtVorhanden.txt' prüfen will und man keine Leserechte in "Gesperrt" hat, dann kommt ACCESS_DENIED zurück, auch wenn die Datei nicht existiert. Wenn man nun True zurückliefern würde, könnte das Fatale Folgen haben.
Andreas aka AHUser aka jbg
  Mit Zitat antworten Zitat
jbg

 
Delphi 10.1 Berlin Professional
 
#33
  Alt 3. Okt 2007, 15:22
Wie wäre es mit dieser Funktion:
Delphi-Quellcode:
function FileExists(const Filename: string): Boolean;

  function FailSafe(const Filename: string): Boolean;
  var
    FindData: TWin32FindData;
    h: THandle;
  begin
    { Either the file is locked/share_exclusive or we got an access denied }
    h := FindFirstFile(PChar(Filename), FindData);
    if h <> 0 then
    begin
      Windows.FindClose(h);
      Result := FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY = 0;
    end
    else
      Result := False;
  end;

var
  Code: Integer;
  LastError: Cardinal;
begin
  Code := Integer(GetFileAttributes(Pointer(FileName)));
  if Code <> -1 then
    Result := (FILE_ATTRIBUTE_DIRECTORY and Code = 0)
  else
  begin
    LastError := GetLastError();
    Result := (LastError <> ERROR_FILE_NOT_FOUND) and
              (LastError <> ERROR_PATH_NOT_FOUND) and
              FailSafe(Filename);
  end;
end;
Andreas aka AHUser aka jbg
  Mit Zitat antworten Zitat
Benutzerbild von bigg
bigg
 
#34
  Alt 3. Okt 2007, 15:46
Die von dir gepostete Version macht bei mir keine Anstalten. Wobei man dann gleich mit Windows.FindFirstFile arbeiten könnte.

Zur Übersicht, hier noch die D7-Original-Fassung:
Der rot eingefärbte Teil könnte raus.

Zitat von D7-RTL:
function FileAge(const FileName: string): Integer;
var
Handle: THandle;
FindData: TWin32FindData;
LocalFileTime: TFileTime;
begin
Handle := FindFirstFile(PChar(FileName), FindData);
if Handle <> INVALID_HANDLE_VALUE then
begin
Windows.FindClose(Handle);
if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 then
begin
FileTimeToLocalFileTime(FindData.ftLastWriteTime, LocalFileTime);
if FileTimeToDosDateTime(LocalFileTime, LongRec(Result).Hi,
LongRec(Result).Lo) then Exit;
end;

end;
Result := -1;
end;


function FileExists(const FileName: string): Boolean;
begin
Result := FileAge(FileName) <> -1;
end;
  Mit Zitat antworten Zitat
jbg

 
Delphi 10.1 Berlin Professional
 
#35
  Alt 3. Okt 2007, 15:48
Zitat von bigg:
Wobei man dann gleich mit Windows.FindFirstFile arbeiten könnte.
Wenn du dein System ausbremsen willst, kannst du das ja gerne machen.
Andreas aka AHUser aka jbg
  Mit Zitat antworten Zitat
Benutzerbild von bigg
bigg
 
#36
  Alt 3. Okt 2007, 16:36
Zitat von jgb:
Wenn du dein System ausbremsen willst, kannst du das ja gerne machen.
Jein.
Der Leistungsgewinn von etwa 100% überzeugen mich dann doch.
Wobei deine Funktion im WorstCase (pagefile.sys) recht bescheiden weg kommt. *hüstel*

Delphi-Quellcode:
function RTL_MOD_FileExists(const FileName: String): Boolean;
var
  Handle: THandle;
  FindData: TWin32FindData;
begin
  Result := False;
  Handle := Windows.FindFirstFile(PChar(FileName), FindData);

  if Handle <> INVALID_HANDLE_VALUE then
  begin
    Result := ( (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 );
    Windows.FindClose(Handle);
  end;
end;


function jgbFileExists(const Filename: string): Boolean;

  function FailSafe(const Filename: string): Boolean;
  var
    FindData: TWin32FindData;
    h: THandle;
  begin
    { Either the file is locked/share_exclusive or we got an access denied }
    h := Windows.FindFirstFile(PChar(Filename), FindData);
    if h <> 0 then
    begin
      Windows.FindClose(h);
      Result := FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY = 0;
    end
    else
      Result := False;
  end;

var
  Code: Integer;
  LastError: Cardinal;
begin
  Code := Integer(Windows.GetFileAttributes(Pointer(FileName)));
  if Code <> -1 then
    Result := (FILE_ATTRIBUTE_DIRECTORY and Code = 0)
  else
  begin
    LastError := Windows.GetLastError();
    Result := (LastError <> ERROR_FILE_NOT_FOUND) and
              (LastError <> ERROR_PATH_NOT_FOUND) and
              FailSafe(Filename);
  end;
end;



procedure TForm1.Button1Click(Sender: TObject);
var b: Boolean;
    i: Integer;
    Start: Cardinal;
    s, FileName: String;
begin
  i := 0;
  Start := Windows.GetTickCount;
  //FileName := 'C:\pagefile.sys';
  FileName := 'C:\boot.ini';

  repeat
    //b := jgbFileExists(FileName);
    b := MyFileExists(FileName);
    inc(i);
  until (i > 100000);

  if b then
    s := 'True'
  else
    s := 'False';

  ShowMessage( IntToStr(Windows.GetTickCount - Start) + ' ms' + #13#10 + s);
end;

Gruß
  Mit Zitat antworten Zitat
jbg

 
Delphi 10.1 Berlin Professional
 
#37
  Alt 3. Okt 2007, 16:47
Zitat von bigg:
Wobei deine Funktion im WorstCase (pagefile.sys) recht bescheiden weg kommt. *hüstel*
Die Frage ist wohl eher, wie oft man denn auf pagefile.sys prüft. In meinem ganzen Leben habe das nicht ein mal gemacht. Der Worst Case tritt bei mir also nie ein.
Andreas aka AHUser aka jbg
  Mit Zitat antworten Zitat
Benutzerbild von bigg
bigg
 
#38
  Alt 3. Okt 2007, 17:02
Zitat von jbg:
Die Frage ist wohl eher, wie oft man denn auf pagefile.sys prüft. In meinem ganzen Leben habe das nicht ein mal gemacht. Der Worst Case tritt bei mir also nie ein.
Abwarten und Tee trinken heißt hier die Devise.
Wobei es ja nicht nur um die Pagefile.sys ging, sondern eher um den vielleicht eintreffenden Fehlerfall, sprich die Datei ist geöffnet, schreibgeschützt und andere Prozesse dürfen auf sie nicht zugreifen. Das das der seltenste Fall sein dürfte, wissen wir ja beide.

btw: Das waren jetzt zwei ganze Seiten für eine poplige Funktion.
Aber der Aufwand hat sich gelohnt.
  Mit Zitat antworten Zitat
jbg

 
Delphi 10.1 Berlin Professional
 
#39
  Alt 3. Okt 2007, 17:07
Zitat von bigg:
btw: Das waren jetzt zwei ganze Seiten für eine poplige Funktion.
Zwei Seiten. Dann rate mal wie viele Tage und Wochen ich über eine schnellere Version von irgendwelchen RTL/VCL/IDE Funktionen brüte. Das was ihr immer seht, ist nur der bereits getestete Code.
Andreas aka AHUser aka jbg
  Mit Zitat antworten Zitat
Benutzerbild von bigg
bigg
 
#40
  Alt 3. Okt 2007, 17:20
Klar, das war auch keine Beschwerde meinerseits. Im übrigen kenne ich die Problemmatiken des Programmierens.
Insbesondere wenn man mehrere Anwendungen entwickelt, da sitzt man schon ein paar Jährchen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 5   « Erste     234 5      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz