Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.01.14;
Скачать: CL | DM;

Вниз

Хорошая ли идея?   Найти похожие ветки 

 
BaryVetaL ©   (2006-03-27 10:22) [0]

Друзья!
У меня появилась одна идея, я за нее пока не берусь потому, что не знаю даст ли эта идея хорошие результаты в оптимизации. Поэтому хочу сначала спросить у Вас.

Это конечно не совсем по теме KOL, но все таки хочется спросить.

Это касается VCL:
Вот, предположим, у нас есть программа написанная с использованием VCL. Что если взять все модули, которые используются в программе, скопировать в другую папку, поменять названия модулей (добавить к примеру какой нибудь префкис, например: _StdCtrls, _SysUtils, ...), затем пробежаться по коду программы и посмотреть какие переменные из VCL используются. Потом закоментировать (программно), в модулях _... все неиспользуемые переменные.
Например, если пользователь не использовал переменную Screen (Screen.Width, Screen.Height), то закоментировать ее в скопированных модулях.
Но это еще не все, далее поиск можно осуществить в используемых классах на предмет неиспользованых свойств. К примеру Application.ExeName я не разу не вызывал, так зачем свойство ExeName включать в TApplication?

Далее в нашей программе заменить все модули на только что созданные и компильнуть!

В KOL такое в принципе делать бесполезно, так как там все и без этого Ok (но не используемые свойства в объекте так же можно удалить, хотя это ничего не даст :) ).

Даст ли такая оптимизация какие то результаты? Или это лишь плоды моей фантазии? Лично мое мнение, что это что нибудь да и даст, если размер программы сократиться хотя бы в двое или на треть, то это будет вообще говоря здорово...
Поделитесь своим мнением.


 
NightLord ©   (2006-03-27 11:58) [1]

Это не реально. Помню как то пытался вырезать процедуру из SysUtils, неохота было подключать весь модуль, Так пришлесь помимо этой еще процедуры 4 скопировать.
Насколько я заметил тама все свойства завязаны на тугой узел, и если убирать одно свойство то придется убирать кучу процедур использующих это свойство. Вы сможете сделать это програмно, так что бы процедуры в которых используется ненужное свойство коректно работали. И вообще в делфи есть свой достаточно умный "чистильшик кода".


 
BaryVetaL ©   (2006-03-27 12:12) [2]

Почему не реально? Очень даже реально... Программно это сделать можно, в вот вручную конечно будет трудно :)


 
homm ©   (2006-03-27 12:45) [3]

Это называется SmartLinking и реализовано в компиляторе Delphi. Вывод - все что включается в исполняемый файл - ИСПОЛЬЗУЕТСЯ либо теоретически может использоватся.
ЗЫ. Не подумай, что я опять критикую твои идеи потому что они "твои". Просто так получается ;)


 
BaryVetaL ©   (2006-03-27 13:03) [4]

то есть без вариантов... ну ладно...
2homm: ;-)


 
nester   (2006-03-27 13:27) [5]

Неее.
Идея нормальная. Только придется явно руками делать. Ну или потратить мнооого времени на написание автомата.
Оптимизатор Делфи работает не всегда так как нам надо.
Приведу пример. Допустим ты используешь метод какойто, который вызывает событие такоето, которое использует еще фиииииииииг знаааааает сколько всего. А тебе это событие нафиг не надо, а оно за собой много еще всего тянет и автоматически не удаляется. Поэтому ты ручками убираешь вызов этого события, затем грохаешь нафиг само событие и все что оно тянет.
Я сам так частенько делаю. Иногда удается получить двухкратный выигрыш в уменьшении размера.


 
ECM ©   (2006-03-27 13:30) [6]


> homm ©   (27.03.06 12:45) [3]

Это конечно не совсем так. Если бы SmartLinking действительно работал с классами... такого разростания кода не было бы...
Для Object - это работает. Там если виртуальный метод действительно не используется то он и в VMT-не попадает....соответсвенно его можно безболезненно выбросить.
С классами - всё гораздо хуже. В VMT-пишется всё без исключения - соответсвенно даже если этот метод ни разу не вызывается - ссылка на него всё равно есть (VMT) и в загружаемый модуль он попадает сам и всё что он за собой тянет....:(


 
BaryVetaL ©   (2006-03-27 14:08) [7]

То есть я все таки в чем то прав?
Просто даже идеи создания такого автомата я не видел нигде! Смущает тот факт, что если бы все было так просто, то этим давно кто нибудь занялся... Может здесь есть много подводных камней, которых не видно с первого взгляда, хотя какие?


 
Kealon ©   (2006-03-27 14:46) [8]

компилятор тока если свой написать, который будет анализировать по умнее дельфийского или не совсем компилятор, а скорее анализатор
например суёшь ему текст программы, а он тебе давай таскать все исходники проц и классов из модулей и например накропает файл или группу файлов без использования стандартных модулей, правда есть момент с модулями без исходников


 
Vedun   (2006-03-27 23:00) [9]

Идея интересная. И подводных камней тут скорее всего выше крыши. :) Вроде-как все просто: просмотреть текст программы; запомнить, какие свойства, методы и др. используется; найти их в используемых модулях и оставить, а все остальное заккоментировать.

Может поговорим о возможной реализации? Тогда ясно станет, стоит ли игра свеч или нет.


 
Dimaxx ©   (2006-03-28 02:24) [10]

Господа, все это можно сделать с помощью директив условной компиляции. {IFDEF}...{ENDIF}. Внесите внутрь этого каждую функцию, метод класса и т.п. Тока обзовите как-нить понятно. Тогда все трудности буду связаны с нахождением имени функции и построении файла, в котором будут одни {DEFINE}.

Приведу пример. Неиспользуется у вас в проекте Application.ExeName. Заключим все относящееся к нему например так:

{IFDEF APPLICATION_EXENAME}
   function GetExeName: string;
{ENDIF}
...
{IFDEF APPLICATION_EXENAME}
   property ExeName: string read GetExeName;
{ENDIF}
...
{IFDEF APPLICATION_EXENAME}
function TApplication.GetExeName: string;
begin
 Result := ParamStr(0);
end;
{ENDIF}


И все. Теперь когда нам надо исключить использование этого свойства - мы просто не запишем определение APPLICATION_EXENAME. Или наоборот, запишем его как

{DEFINE APPLICATION_EXENAME}

Тока кто возьмется перелопатить кучу кода? А ведь некоторые свойства завязаны друг на друге и городить громадную многоуровневую конструкцию из {IFDEF}...{ENDIF} как-то не катит...


 
BaryVetaL ©   (2006-03-28 09:43) [11]

Да, использование IFDEF здесь оправдано и пожалуй является наиболее подходящим решением нежели простое комментирование.

Первая трудность: если в классе используется метод родителя (по inherited) то нужно это выловить, а следовательно нужно добавить в соответствующий метод родителя директиву IFDEF, на этом в принципе и будет завязана оптимизация, то есть родительские не нужные методы пихать не будем.


 
BaryVetaL ©   (2006-03-29 09:53) [12]

Хотелось бы узнать мнение Владимира Кладова, Thaddy, ... и других гуру, которые пока еще ничего не сказали по этому поводу.


 
RA ©   (2006-03-29 11:21) [13]

И снова здравствуйте.
С первого взляда идея проста, но если взглянуть под другим углом, то ... Но нет ничего невозможного. И чтоб дело сдвинулось с мертвой точки, то для начала нужно написать лексический анализатор делфовского кода (а то как вы собираетесь вылавливать процедуры и их вызовы), а для этого нужна граматика языка. А вот и первый камень - написать качественную громатику языка. Честно - пытался, и сделал процентов на 10, а потом почему-то остановился.



Страницы: 1 вся ветка

Текущий архив: 2007.01.14;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.025 c
1-1164358778
bva
2006-11-24 11:59
2007.01.14
Длинная строка в ComboBox


15-1166794248
Pit_q
2006-12-22 16:30
2007.01.14
Интересно, у всех сотрудников ГИБДД есть водительские права?


1-1164118352
312kbps
2006-11-21 17:12
2007.01.14
Ini файл, не работает DeleteKey() !


3-1161858560
Ольга
2006-10-26 14:29
2007.01.14
Возврат значений из хранимой процедуры


11-1143099775
DmiSb
2006-03-23 10:42
2007.01.14
Не получается очистить DBF файл, используя KOLmdvDBF





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский