Próbuję obejść znane ograniczenie wydajności brzydkiego w System.Classes.pas, który posiada 1980 era granicę stały bufor ($ F000), który wygląda tak:Czy mogę zmodyfikować stałą w klasie RTL System.Classes.TStream i odbudować ją w środowisku wykonawczym w Delphi XE6?
function TStream.CopyFrom(const Source: TStream; Count: Int64): Int64;
const
MaxBufSize = $F000;
....
Powoduje to znaczne pogorszenie się wyników w naszej aplikacji Delphi. W Delphi XE2 przez XE5, byliśmy w stanie zmienić to i użyj jednej z następujących metod:
mogę zmodyfikować źródła Delphi, a następnie, powołując dcc32.exe z pliku wsadowego, przebudować system .Classes.dcu w folderze biblioteki Delphi. Rozumiem, że to jest brzydkie i nie podobało mi się to, ale nie podoba mi się ten brzydki problem z wydajnością w RTL, a nasi użytkownicy nie mogą żyć z powodu problemów związanych z wydajnością, jakie powoduje.
Mogłabym spróbować umieścić zmodyfikowany plik system.classes.pas gdzieś w mojej ścieżce wyszukiwania projektu.
Żadne z powyższych podejść nie działa dla mnie w Delphi XE6, teraz, prawdopodobnie dzięki pewnym wewnętrznym zmianom kompilatora. Błąd pojawia się w minimalnej aplikacji wiersza poleceń, które obejmuje System.Contnrs w klauzuli zastosowań, jest to:
[dcc32 Fatal Error] System.Classes.pas(19600): F2051 Unit System.Contnrs was compiled with a different version of System.Classes.TComponent
Przykładowy program do odtworzenia tego problemu (zakładając, że zostały zmodyfikowane System.Classes.pas i zmienił MaxBufSize stała), pokazany jest tu:
program consoletestproject;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.Contnrs,
System.SysUtils;
var
List:System.Contnrs.TObjectList;
begin
WriteLn('Hello world');
end.
Znowu ten problem łatwo rozmnaża się w Delphi XE6, ale nie jest to problem w XE5 lub wcześniej.
Jaka jest zalecana praktyka, gdy absolutnie MUSZĘ obchodzić podstawowe ograniczenia RTL lub VCL przy użyciu zmodyfikowanej kopii System.Classes.pas lub System.SysUtils.pas lub innej jednostki o bardzo niskim poziomie? (Tak, wiem, że NIE powinieneś tego robić, jeśli nie musisz, nie przejmuj się wykładem.)
Czy istnieje magiczny zestaw parametrów wiersza poleceń, których można użyć poprzez "dcc32.exe" na wierszu poleceń, aby utworzyć zmodyfikowaną jednostkę DCU, która będzie poprawnie łączyła się z powyższym przykładem aplikacji?
Jako drugie pytanie, czy istnieją pliki .dcu, dla których nie istnieje żadne źródło, które zostanie przerwane, gdy ktoś spróbuje to zrobić, w takim przypadku odpowiedź na wszystkie powyższe pytania brzmi: "nie można tego naprawić i jeśli jest błąd w RTL, nie masz szczęścia "?
Jednym z możliwych obejść jest włączenie "$ (BDS) \ source \ rtl \ common" w ścieżce wyszukiwania projektu (lub ścieżki biblioteki), zmuszając każdego uszkodzonego (wymagającego rekompilacji) DCU do odbudowy KAŻDEGO czasu, ale wydaje się to brzydkie i źle.
Można uniknąć tego rodzaju problemów łatanie metodę na pamięć korzystając z objazdu. – RRUZ
Jakieś próbki lub przykłady tego podejścia? Mogę użyć haka kodu i zastąpić całą metodę? –
Tak, zastąpić całą metodę. Wysłałem tutaj kod, żeby zrobić to wiele razy. Więc miejcie innych. Istnieją biblioteki, ale jest to przesada, aby uzyskać pełną wymianę. –