Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Посоветуйте как можно еще оптимизировать кусок кода [D6, WinXP]


DVM ©   (2003-04-07 10:15:00) 

Пишется некоторая программа на WinApi. Требуется создать EXE файл минимального размера.
В этой программе ведется лог файл ее работы следующим образом:

procedure PrintLog(LogMessage:Pchar);

function StrLen(const Str: PChar): Cardinal; assembler;
asm
MOV EDX,EDI
MOV EDI,EAX
MOV ECX,0FFFFFFFFH
XOR AL,AL
REPNE SCASB
MOV EAX,0FFFFFFFEH
SUB EAX,ECX
MOV EDI,EDX
end;

const
szLogFileName : array[0..9] of char = "file.log"#0;
NewRow : array [0..1] of char = #10#13;
var
hLogFile: THandle;
RetLength:Cardinal;
begin
hLogFile := CreateFile(szLogFileName,
GENERIC_WRITE,
FILE_SHARE_READ,
0,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
0);

if hLogFile = INVALID_HANDLE_VALUE then
begin
MessageBox (0, "Error!", "Error!", MB_OK);
exit;
end;
try
SetFilePointer(hLogFile, 0, 0, FILE_END);
WriteFile(hLogFile, LogMessage^, StrLen(LogMessage), RetLength, 0);
WriteFile(hLogFile, NewRow, SizeOf(char)*2, RetLength, 0);
finally
CloseHandle(hLogFile);
end;
end;

Использовать SysUtils не могу, так он увеличивает размер программы на 40(!) кб. Стандартными процедурами Pascal для работы с текстовыми файлами пользоваться не могу по той же причине (+8 кб к размеру).
По этой причине функция StrLen перенесена из SysUtils.

Можно ли как еще оптимизировать эту процедуру? Что посоветуете?
Переписал бы все на ASM-е, но не знаю я его.


DVM   (2003-04-07 21:02:00) [1]


> Morfein

Спасибо за рацпредложения :)


Morfein   (2003-04-07 21:01:00) [2]

А exe больше...


DVM   (2003-04-07 20:42:00) [3]

А что на C код меньше получается? Исходник короче это да. А экзешник?


Morfein   (2003-04-07 20:39:00) [4]

ASM, как здесь уже говорилось недавно, это не панацея!!!
Во-первых, StrLen можно заменить на lstrlen из kernel32.dll.
Во-вторых, try-finally выкинуть... данные функции WinApi не генерирует исключений...
В-третьих, вместо szLogFileName, наверное, надо-таки использовать "FILE.LOG". :)
В-четвёртых, вместо отдельной записи в файл разделителя #13#10, лучше использовать lstrcat(LogMessage, pchar(#13#10)) + WriteFile(..., LogMessage^, ...);


Polevi   (2003-04-07 20:35:00) [5]

на C пробовал ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо