Я пытаюсь работать с известным уродливым ограничением производительности в System.Classes.pas, который имеет ограничение буфера постоянной эры 1980-х ($ F000), которое выглядит следующим образом:
function TStream.CopyFrom(const Source: TStream; Count: Int64): Int64;
const
MaxBufSize = $F000;
....
Это приводит к серьезным нарушениям производительности в нашем приложении Delphi. В delphi XE2 - XE5 мы смогли изменить это и использовать один из следующих подходов:
-
Я мог бы изменить источники Delphi, а затем, вызвав dcc32.exe из командного файла, перестроит файл System.Classes.dcu в папке библиотеки Delphi. Я понимаю, что это некрасиво, и мне это не нравилось, но мне не нравится эта уродливая проблема с производительностью в RTL, и наши пользователи не могут жить с головными болями производительности, которые она вызывает.
-
Я мог бы попытаться поместить модифицированный файл system.classes.pas где-нибудь в пути поиска проекта.
Ни один из вышеперечисленных подходов не работает для меня в Delphi XE6, теперь, возможно, благодаря некоторым внутренним изменениям компилятора. Ошибка, которую я получаю в приложении с минимальной командной строкой, которое включает в себя условие System.Contnrs в своем примере использования:
[dcc32 Fatal Error] System.Classes.pas(19600): F2051 Unit System.Contnrs was compiled with a different version of System.Classes.TComponent
Образец программы для воспроизведения этой проблемы (если вы изменили System.Classes.pas и изменили константу MaxBufSize), показан здесь:
program consoletestproject;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.Contnrs,
System.SysUtils;
var
List:System.Contnrs.TObjectList;
begin
WriteLn('Hello world');
end.
Опять же, эта проблема легко воспроизводится в Delphi XE6, но не является проблемой в XE5 или ранее.
Какова рекомендуемая практика, когда вы абсолютно ДОЛЖНЫ работать с фундаментальным ограничением RTL или VCL с использованием модифицированной копии System.Classes.pas или System.SysUtils.pas или какого-либо другого устройства с очень низким уровнем? (Да, я знаю, что вы НЕ должны этого делать, если вам это не нужно, не беспокойтесь о лекции.)
Есть ли волшебный набор параметров командной строки, которые вы можете использовать с помощью "dcc32.exe" в командной строке, чтобы создать измененное DCU, которое будет правильно связываться с примером приложения выше?
В качестве второстепенного вопроса существуют файлы .dcu, для которых не существует источника, который будет ломаться, когда кто-то пытается это сделать, и в этом случае ответ на все вышеперечисленное есть: "вы не можете исправить это, и если там ошибка в RTL, вам не повезло"?
Одним из возможных способов решения проблемы является включение "$ (BDS)\source\rtl\common" в путь поиска по проекту (или путь к библиотеке), заставляющий каждый разбитый (нуждающийся в перекомпиляции) DCU перестраивать КАЖДОЕ время, но это кажется уродливым и неправильно.