Форум — Ответы     (  К темам )
 ?  ACD: Где можно узнать какой компонент на сколько увеличивает экзешник? (29-03-2003 03:32:48)
Где можно узнать какой компонент на сколько увеличивает экзешник?
...какая функция за сколько тактов выполняется?
(кроме измерения "вручную")
 Георгий (29-03-2003 12:15:35)
о размерах — при использовании стандартных компонентов >2 MB не будет...
основное место занимают текстовые таблицы и жуткое количество рисунков (BMP, ICO, CUR), причём не обязательно их использовать в программе — они добавляются вместе с компонентами — зачем добавляются — надо у Borland`а спросить...

можно провести эксперимент:
PE написанная на ASM, скомпилированная WASM и слинкованная WLINK сжимается UPX на 2-5%
PE созданная в BCB жмётся UPX`ом на 2-5 (чего бы вы думали) РАЗА

наличие рисунков легко проверяется с пом. любого т.н. "хакерского" редактора PE, который умеет с ресурсами работать...

Для BCB я нормальных профайлеров не видел.
А в ручную — это ты так RDTSC называешь?
но считать число тактов на выполнение процедуры в многозадачной ОС особого смысла не имеет.
 ACD (30-03-2003 04:40:17)
" — при использовании стандартных компонентов >2 MB не будет..." — не утешительно.
Разъясните plz термины PE и RDTSC.
про такты — согласен , вопрос сформулировал не так , точнее меня интересует
объем кода а еще точнее где можно почитать исходники WinApi(и прочих) функций?
А про компоненты — где нибудь есть информаця на сколько какой компонент увеличивает размеры .exe и сколько памяти он занимает при выполнении процесса.

спасибо за ответ.
 Георгий (30-03-2003 21:46:26)
PE:
Все Windows-приложения используют специальный формат исполнимых файлов — формат PE (Portable Executable). Такие файлы начинаются как обычные EXE-файлы старого образца (их также называют MZ по первым двум символам заголовка), и, если такой файл запустить из DOS, он выполнится и выдаст сообщение об ошибке (текст сообщения зависит от используемого компилятора), в то время как Windows заметит, что после обычного MZ-заголовка файла идёт PE-заголовок, и запустит приложение.
 Георгий (30-03-2003 21:49:59)
Помещает в регистровую пару EDX:EAX текущее значение счётчика тактов — 64-битового машинно-специфичного регистра TSC, значение которого увеличивается на 1 каждый такт процессора с момента его последней перезагрузки.

Взято из книги Assembler написанной Зубковым С.В. и изданной ДМК в 1999г.

об исходниках WinAPI — это фактически исходники Windows — они с недавнего времени доступны представителям государственных организаций (фактически военным), но только для ознакомления с ними (т.е. смотреть глазами можно но не более)

По поводу памяти — неужели сейчас, когда обьём оперативной памяти исчисляется сотнями мегабайт, а операционная система (при наличии поддержки со стороны аппаратуры) реализует систему виртуальной памяти, которая расширяет обьём доступной для приложений оперативной памяти до 4GB, всё ещё возникает НЕОБХОДИМОСТЬ в создании компактных приложений?
По моему на данный момент программирование переросло из научно — исследовательской деятельности в производство, что привело к актуальности других критериев: скорость выполнения работ (написание программы) и качество (надёжность выполнения заявленных функций). В редких случаях, когда актуальна производительность программы, выполняют т.н. оптимизацию ПО — переписка отдельных частей кода с использованием более эффективных алгоритмов и только в случае крайней нужды прибегают к рассчёту числа байт кода и тактов выполнения процедур...

Советую тебе более точно оценить необходимость знания размеров компонентов, тем более, что мне не известны ни размеры компонентов, ни занимаемая ими память. Я даже не встречал упоминаний о размерах из официальных источников...
 Георгий (30-03-2003 21:50:38)
в начало пред поста — описание команды RDTSC
 Владимир (31-03-2003 00:27:23)
Если стоит вопрос о компактности кода и это очень важно,
то надо переходить на Visual C++, он генерит значительно
компактнее код, чем С++Builder, если-же важна скорость разрабоки
и удобство, и также вохможность быстрой доделки/переделки/изменения
программы, то выигрыш явно за C++Builder

Как правильно сказал Георгий — выбирайте, что вам важнее.
(обьём оперативной памяти исчисляется сотнями мегабайт,
а винчестера — десятками дешевых гигабайт)
 ACD (31-03-2003 03:37:17)
Согласен что на первом месте идут скорость и надежность программы.Но всеже помоему размер .exe тоже играет не последнюю роль.Если можно не теряя в первых
двух критериях сделать прогу(на диске , а не в виртуальной памяти)меньше то к этому нужно стремиться.
А про измерение времени затраченного на выполнение определенного участка кода
программы в мультизадачной ос (win32) нашел у Рихтера очень красивый пример -
там учитывается переключение потоков.
Однажды я написал две абсолютно идентичные консольные програмки на VC++ 6.0 и
Builder 5.0 програмка на билдере была более чем в два раза меньше.(Может я что
то в опциях VC++ напорол)
К стати везде слышу , что программы на VC++ надежнее чем на Builder и Delfi это
в самом деле так ?

спасибо за ответы.
 Георгий (31-03-2003 09:26:43)
"К стати везде слышу , что программы на VC++ надежнее чем на Builder и Delfi это
в самом деле так ?"

Надёжность программ полностью определяется программистом (а вернее оплатой его времени)!
За BCB и Delphi часто садятся люди, которые не понимают, что делают — примеров даже в этом форуме море, а за VC сесть можно, но у него более сложный процесс проектирования программ и это этих людей отпугивает. Вот и результат на VC обычно пишут квалифицированные программисты...
Но у Borland есть ряд глюков, которые заставляют программистов напрягаться, чтоб потом не мучиться с ними, например очень удивительно работающий BDE, не любящий много поточность VCL, но если не использовать BDE и самому реализовать последовательный или из главного потока доступ к VCL обьектам, то работать будет нормально.

Самая большая надёжность на данный момент у JAVA — если все библиотечные классы реализованы корректно, то писать можно очень криво, но машину (сервер) не повесишь.

Покажи Рихтеровский пример.
 ACD (02-04-2003 03:38:53)
Пример Рихтера:

__int64 FileTimeToQuadWord(PFILETIME pft)
{
return(Int64ShlMod32(pft->dwHighDateTime,32) | pft->dwLowDateTime);
}

void LongOperation()
{
FILETIME ftKernelTimeStart,ftKernelTimeEnd,ftUserTimeStart,ftUserTimeEnd,ftDummy;
__int64 qwKernelTimeElapsed,qwUserTimeElapsed,qwTotalTimeElapsed;

GetThreadTimes(GetCurrentThread(),&ftDummy,&ftDummy,&ftKernelTimeStart,&ftUserTimeStart);

//здесь измеряемый код

GetThreadTimes(GetCurrentThread(),&ftDummy,&ftDummy,&ftKernelTimeEnd,&ftUserTimeEnd);

qwKernelTimeElapsed=FileTimeToQuadWord(&ftKernelTimeEnd)-FileTimeToQuadWord(&ftKernelTimeStart);
qwUserTimeElapsed=FileTimeToQuadWord(&ftUserTimeEnd)-FileTimeToQuadWord(&ftUserTimeStart);
qwTotalTimeElapsed=qwKernelTimeElapsed+qwUserTimeElapsed;
}

Ложка дегтя:В w9x GetThreadTimes и GetProcessTimes определены но не реализованы.