![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Посоветуйте как можно еще оптимизировать кусок кода [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 пробовал ?