Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.06.2013, 12:55   #11
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
А разве компилятор не подключает из модулей только то что используется?
Нет, практика показывает, что компилятор не разбирает что надо а что не в программе, и просто компилирует все скопом.
В этом БОльшой минус по-блочной компиляции, нельзя установить взаимосвязи между модулями для выборки только используемого кода, ДО компиляции, а после компиляции этим занят линкер и же поздно

Макс. оптимизация это вырезание не используемых Unit'ов из Uses, да и не всегда работает.

Цитата:
Не, мне нужен тип TLVItem, TStringList чисто для примера.
KOL & MCK, др. вариантов нет, кроме как ручками и самому.
С KOL & MCK ручкми не придется, но можете вообще забыть про компоненты/классы Delphi, тем более сторонние.

Последний раз редактировалось Человек_Борща; 06.06.2013 в 13:01.
Человек_Борща вне форума Ответить с цитированием
Старый 12.01.2024, 22:57   #12
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

в продолжении темы. столкнулся с тем, что сами модули Windows, Registry, SysUtils, Classes, TlHelp32 "тяжёлые", т.к. имеют внутри много процедур, функций и констант, а мне при работе надо лишь одну или несколько процедур.
При компиляции размер приложения оказывается "раздут", а при использовании урезанных модулей, размер значительно уменьшается. 500 Кб и 20 Кб - разница ощутима, хотя по быстродействию не сравнивал пока. Что там вообще за 480 кб вписывается в приложение?
Есть какой-то софт, который "вытягивает" из модулей нужную информацию? или все по-старинке подключают модули в неизменном виде, не обращая внимание на размер приложения? А то вручную выискивать все зависимости и отсеивать лишнее - интересно, но муторно. модуль Classes пять дней мучил, чтоб классы TStream, TStringStream,TFileStream и ThandleStream оставить.
--------
для примера, модуль Windows довёл вот до такой дистрофии, стараясь уменьшить размер приложения.
Код:
unit Wn;
interface

function ShowWindow(hWnd:LongWord;nCmdShow:Integer):LongBool;stdcall;
procedure PostQuitMessage(nExitCode:Integer);stdcall;
function SetTimer(hWnd:LongWord;nIDEvent,uElapse:LongWord;lpTimerFunc:Pointer):LongWord;stdcall;
function KillTimer(hWnd:LongWord;uIDEvent:LongWord):LongBool;stdcall;
function SetFileAttributes(lpFileName:PChar;dwFileAttributes:LongWord):LongBool;stdcall;
function GetDriveType(lpRootPathName:PChar):LongWord;stdcall;
function DialogBoxParam(hInstance:LongWord;lpTemplateName:PChar;hWndParent:LongWord;lpDialogFunc:Pointer;dwInitParam:LongInt):Integer;stdcall;
function DialogBox(hInstance:LongWord;lpTemplate:PChar;hWndParent:LongWord;lpDialogFunc:Pointer):Integer;

implementation

function ShowWindow;external 'user32.dll' name 'ShowWindow';
procedure PostQuitMessage;external 'user32.dll' name 'PostQuitMessage';
function SetTimer;external 'user32.dll' name 'SetTimer';
function KillTimer;external 'user32.dll' name 'KillTimer';
function SetFileAttributes;external 'kernel32.dll' name 'SetFileAttributesA';
function GetDriveType;external 'kernel32.dll' name 'GetDriveTypeA';
function DialogBoxParam;external 'user32.dll' name 'DialogBoxParamA';
function DialogBox(hInstance:LongWord;lpTemplate:PChar;hWndParent:LongWord;lpDialogFunc:Pointer):Integer;
begin
   Result:=DialogBoxParam(hInstance,lpTemplate,hWndParent,lpDialogFunc,0);
end;

end.
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.

Последний раз редактировалось NetSpace; 12.01.2024 в 23:06.
NetSpace вне форума Ответить с цитированием
Старый 13.01.2024, 02:19   #13
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
Сообщение от NetSpace Посмотреть сообщение
при использовании урезанных модулей, размер значительно уменьшается. 500 Кб и 20 Кб - разница ощутима
Кому и для чего она ощутима?
Стандартные приложения от мелкомягкого офиса имеют размер от 1,5 до 27 МБ.
И всё работает нормально. И никого это не раздражает. Так почему это раздражет вас?
northener вне форума Ответить с цитированием
Старый 13.01.2024, 15:28   #14
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,777
По умолчанию

Цитата:
Сообщение от NetSpace Посмотреть сообщение
в продолжении темы. столкнулся с тем, что сами модули Windows, Registry, SysUtils, Classes, TlHelp32 "тяжёлые"
ЕМНИП, Windows, Registry и TlHelp32 — оберточные модули, транслирующие вызовы WinAPI в Паскаль. Накладные расходы — несколько десятков байт на пустые разделы initialization/finalization, который Delphi и не думает вырезать.

А вот SysUtils и Classes тяжелы, поскольку содержат в себе кучу инициализаций глобальных переменных экземплярами всяких служебных классов, — вне зависимости от того, используете вы их в программе или нет. Borland в своё время нежно заботилась о быдлопрограммистах, чтобы писать код им было легко и ненапряжно, как в Visual Basic. Глобальные переменные — наследие тех времен.

SysUtils, помимо прочего, содержит также реализацию исключений, которые подключаются и начинают работать (в том числе перехватывать системные и аппаратные исключения) без вашего участия, просто по факту появления SysUtils в uses. Это, наверное, больше хорошо чем плохо, но добавляет лишние килобайты к exe-шнику. Исключения из SysUtils потом используют классы из Classes — тут уже никак.

Облегченные модули, собственно, — по большей части удаление именно инициализаций глобальщины.

Вообще, сам по себе компилятор Паскаля от Borland, будь то Turbo Pascal или Delphi, — оптимизирующий, еще с версии TP 4.0 умеющий компоновать только реально вызываемый код. Облегченные модули не давали бы выигрыша в размере, если бы было не так. Проблема именно в откровенно говняной архитектуре объектно-ориентированных модулей RTL и VCL, сводящей все возможности умной компоновки на нет. Человеческие ошибки лечатся только другим человеком, никакой автоматизированной процедуры исправления архитектуры пока не изобрели. Поэтому выход — делать облегченные модули самому или использовать готовые.
Vapaamies вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как подключить модуль? Richik123 Паскаль, Turbo Pascal, PascalABC.NET 10 11.10.2012 17:05
Как подключить свой модуль? Murman_men Помощь студентам 1 17.11.2011 06:25
Как подключить графический модуль в D7 MyLastHit Общие вопросы Delphi 4 09.12.2010 16:52
Как подключить модуль в С# ? vedro-compota Общие вопросы .NET 11 07.12.2010 19:33
Как подключить модуль??? diliana Общие вопросы Delphi 3 29.05.2009 19:14