![]() |
RtlVclOptimize 2.77 - DelphiSpeedUp Code im eigenen Programm
Liste der Anhänge anzeigen (Anzahl: 1)
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
|
Re: RtlVclOptimize - DelphiSpeedUp Code in eigenen Programme
Da sag ich mal danke fürs frisieren ;)
Wo bekomme ich die FastCode Libary? |
Re: RtlVclOptimize - DelphiSpeedUp Code in eigenen Programme
|
Re: RtlVclOptimize - DelphiSpeedUp Code in eigenen Programme
Werden dadurch mit Delphi erstellte Programme schneller gestartet oder was bringt diese Unit in einem Programm für Vorteile?
|
Re: RtlVclOptimize - DelphiSpeedUp Code in eigenen Programme
Ob sie schneller starten, wage ich zu bezweifeln, weil das ja IDE spezifische Optimierungen sind. Aber die eigenen Programme werden ein klein wenig schneller. Vor allem die String-Vergleiche mit "if S <> 'str' then" oder "if S = 'str' then" gehen um einiges schneller, da keine kleiner oder größer Information beim Vergleich ermittelt werden muss.
Auch die TList/TObjectList wird durch die Unit stark beschleunigt. Dynamische/Message Methoden werden schneller aufgerufen. Zwar immernoch langsamer als virtuelle, aber bis zu 8 mal so schnell als vorher. Und noch einiges mehr. Mit FastCode kombiniert ergibt das einen größeren Geschwindigkeitsschub. |
Re: RtlVclOptimize - DelphiSpeedUp Code in eigenen Programme
Das ist natürlich ein Wort. Für normale Anwendungen wird es sich wahrscheinlich nicht lohnen aber für Parser wäre es bestimmt interessant.
|
Re: RtlVclOptimize - DelphiSpeedUp Code in eigenen Programme
Zitat:
Mal schauen ob ich in den nächsten Wochen ein paar "ruhige" Stunden finde ... |
Re: RtlVclOptimize - DelphiSpeedUp Code in eigenen Programme
Naja, das mit den "if S <> 'str' then", "if S = 'str'" spürt man hauptsächlich bei Delphi 5 bis 2006. Ab Delphi 2007 ist bereits eine schnellere String-Vergleichsfunktion eingebaut, wo das Equal, NotEqual fast nichts mehr herausholen kann.
|
Re: RtlVclOptimize - DelphiSpeedUp Code in eigenen Programme
Zitat:
|
Re: RtlVclOptimize - DelphiSpeedUp Code in eigenen Programme
LOL,
Ich schreib grad zufällig nen Parser für meinen Raytracer ;). Diese Unit kommt mir daher mehr als nur gelegen. Sehe ich das Richtig mit Einbinden meinst du das in etwa so :
Delphi-Quellcode:
Hab das zumindest nu mal so gemacht. Program Simple_Ray; Uses // Bewirkt das die Sringvergleiche deutlich schneller werden. RtlVclOptimize, Forms, unCommenter In '..\..\DatenSteuerung\Tokenizer\UnCommenter.pas', Tokenizer In '..\..\DatenSteuerung\Tokenizer\Tokenizer.pas', Unit1 In 'Unit1.pas' {Form1}, Raytracer In 'Raytracer.pas', Raytracer_Math In 'Raytracer_Math.pas', RayParser In 'RayParser.pas', Unit2 In 'Unit2.pas' {Form2}; {$R *.RES} Begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.CreateForm(TForm2, Form2); Application.Run; End. Ich nutze Delphi 5 und normalerweise sind in der unit Links dann lauter blaue Punkte ( überall bei dem Code den er Nutzt ). Nach dem Compilieren des Projects sind in der RtlVclOptimize unit aber keine Blauen Punkte. Tut ads dann Trotzdem ? |
Re: RtlVclOptimize - DelphiSpeedUp Code in eigenen Programme
Zitat:
Zitat:
|
Re: RtlVclOptimize - DelphiSpeedUp Code in eigenen Programme
thx für die Info,
Nein mir gings net ums Debuggen. Ich hab zwar hier und da schon was in Delphi Geproggt ( siehe Balanced ... ) Aber der Profi bin ich deswegen noch net. Ich verstehe gerne was ich da mache. Und wenn ich was net versteh frage ich. |
Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr
Ich habe mir mal die Mühe gemacht und RtlVclOptimize.pas auf den Stand von DelphiSpeedUp 2.7 zu bringen. Die Versionsnummern habe ich dabei auch gleichgezogen.
Download im ersten Thread-Posting |
Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr
Vielen Dank für die neuen Versionen von DelphiSpeedup und RtlVclOptimize, Andreas!
btw: kleiner Tippfehler auf der Download-Seite: Die Datei "RtlVclOptimize.zip" wird angekündigt mit "Download DDevExtensions 2.7". Gruß Hawkeye |
Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr
Zitat:
|
Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr
Liste der Anhänge anzeigen (Anzahl: 1)
Hi Andreas,
ich habe eben deine Unit getestet. Dabei ist mir aufgefallen, dass beim Beenden einer beliebigen Anwendung Speicherblöcke nicht richtig freigegeben werden. Speichermanager: FastMM 4.78 IDE: Delphi 7 PE Eine Demo liegt bei. |
Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr
Das sind die reallozierten Dynamic Method Tables. Die kann ich nicht freigeben, da sonst das gesamte Programm abstürzen würde. Da muss ich wohl auf GlobalAlloc ausweichen.
|
Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr
Ich habe schnell noch eine neue Version hochgeladen, die die gewollten Speicherlecks vor dem Speichermanager "versteckt".
|
Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr
Die von dir korrigierte Version läuft schon mal ohne rum zu murren.
Ich werde sie mir morgen nochmal genauer anschauen und einige dinge testen. |
Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr
Die Fastfileexists hat einen kleinen schönheitsfehler im vergleich zum original. Das original nimmt auch wildcards, die optimierte variante scheinbar nicht...
|
Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr
Zitat:
|
Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr
Ach ja und ab Delphi 2007 funktioniert diese undokumentierte Funktionalität auch nicht mehr mit FileAge().
|
Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr
moin,
ich habe noch eine Kleinigkeit gefunden: Die Funktion FastFileExists() findet die Auslagerungsdatei "pagefile.sys" nicht. Ist das bei D2005-D2007 auch der Fall? :gruebel: Testsystem: XPSP2, Delphi 7 PE Gruß Stefan |
Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr
Zitat:
Delphi-Quellcode:
Da werde ich gleich mal einen QualityCentral Report aufmachen.
function FileExists(const Filename: string): Boolean;
var Code: Integer; begin Code := Integer(GetFileAttributes(PChar(FileName))); if Code <> -1 then Result := (FILE_ATTRIBUTE_DIRECTORY and Code = 0) else Result := GetLastError = ERROR_SHARING_VIOLATION; end; |
Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr
Zitat:
Du hast den Fehler ja schon behoben?!. Das ging flott. ps: Die abgewandelten Listen sehen auch sehr schmackhaft aus, die werde ich mir auch noch vorknöpfen. Gruß Stefan |
Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr
|
Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr
Das WorkArround funktioniert bei mir nicht. Die Funktion Windows.GetLastError liefert bei mir den Wert 5 "Zugriff verweigert", wenn ich die "pagefile.sys" auf Existenz überprüfe.
So geht's:
Delphi-Quellcode:
function MyFileExists(const Filename: string): Boolean;
var Code: Integer; LastError: Integer; begin Code := Integer(Windows.GetFileAttributes(PChar(FileName))); if Code <> -1 then Result := (FILE_ATTRIBUTE_DIRECTORY and Code = 0) else begin LastError := Windows.GetLastError; Result := (LastError = ERROR_ACCESS_DENIED); end; end; Gruß Stefan |
Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr
Hi,
Ich erhalte für die pagefile.sys ERROR_SHARING_VIOLATION (und nicht ERROR_ACCESS_DENIED)... :gruebel: mfG mirage228 |
Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr
Dann verknüpfen wir das ganze mit or? :P
Delphi-Quellcode:
ps: Bin mit Adminrechten unterwegs, WinXP SP2 und D7PE.
function MyFileExists(const Filename: string): Boolean;
var Code: Integer; LastError: Integer; begin Code := Integer(Windows.GetFileAttributes(PChar(FileName))); if Code <> -1 then Result := (FILE_ATTRIBUTE_DIRECTORY and Code = 0) else begin LastError := Windows.GetLastError; Result := (LastError = ERROR_ACCESS_DENIED) or (LastError = ERROR_SHARING_VIOLATION); end; end; Gruß Stefan |
Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr
Zitat:
|
Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr
Zitat:
|
Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr
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. |
Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr
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; |
Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr
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:
|
Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr
Zitat:
|
Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr
Zitat:
Der Leistungsgewinn von etwa 100% überzeugen mich dann doch. :mrgreen: 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ß :hi: |
Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr
Zitat:
|
Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr
Zitat:
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. :lol: Aber der Aufwand hat sich gelohnt. |
Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr
Zitat:
|
Re: RtlVclOptimize 2.7 - DelphiSpeedUp Code im eigenen Progr
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:37 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