![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
KOL Format/wvsprintf performance hit [Delphi, Windows]
Freeman © (2008-07-14 02:59:00)
function Format(const Fmt: string; const Args: array of const): string;
asm
PUSH ESI
PUSH EDI
PUSH EBX
MOV EBX, ESP
ADD ESP, -2048
MOV ESI, ESP
INC ECX
JZ @@2
@@1:
MOV EDI, [EDX + ECX*8 - 8]
PUSH EDI
LOOP @@1
@@2:
PUSH ESP
PUSH EAX
PUSH ESI
CALL wvsprintf
MOV EDX, ESI
MOV ECX, EAX // by Freeman
MOV EAX, @Result
CALL System.@LStrFromPCharLen // by Freeman, performance hit
MOV ESP, EBX
POP EBX
POP EDI
POP ESI
end;
Thaddy (2008-07-21 17:38:00) [1]This would be a start to work with kol strings.
function FormatBuf(Fmt: PAnsiChar; Args: array of const; Buf: PAnsiChar): Integer;overload;
asm
PUSH EDI
INC ECX
JZ @@2
@@1:
MOV EDI, [EDX + ECX*8 - 8]
PUSH EDI
LOOP @@1
@@2:
PUSH ESP
PUSH EAX
MOV EDI, Buf
PUSH EDI
CALL wvsprintfA
POP EDI
end;
function FormatBuf(Fmt: PWideChar; Args: array of const; Buf: PWideChar): Integer;overload;
asm
PUSH EDI
INC ECX
JZ @@2
@@1:
MOV EDI, [EDX + ECX*8 - 8]
PUSH EDI
LOOP @@1
@@2:
PUSH ESP
PUSH EAX
MOV EDI, Buf
PUSH EDI
CALL wvsprintfW
POP EDI
end;
Freeman (2008-07-15 02:34:00) [2]He-he. In my project (not KOL-based) I'm using these snippets:
function FormatBuf(Fmt: PAnsiChar; Args: array of const; Buf: PAnsiChar): Integer;
asm
PUSH EDI
INC ECX
JZ @@2
@@1:
MOV EDI, [EDX + ECX*8 - 8]
PUSH EDI
LOOP @@1
@@2:
PUSH ESP
PUSH EAX
MOV EDI, Buf
PUSH EDI
CALL wvsprintfA
POP EDI
end;
function WideFormatBuf(Fmt: PWideChar; Args: array of const; Buf: PWideChar): Integer;
asm
PUSH EDI
INC ECX
JZ @@2
@@1:
MOV EDI, [EDX + ECX*8 - 8]
PUSH EDI
LOOP @@1
@@2:
PUSH ESP
PUSH EAX
MOV EDI, Buf
PUSH EDI
CALL wvsprintfW
POP EDI
end;
Thaddy (2008-07-14 11:48:00) [3]Not really strange:
I suppose you are using the unicode version of wvsprintf?
In that case you should call LStrFromPWCharLen.
Otherwise you get a performance hit because the unicodestring gets converted to string in the background by the OS.
Also it is a good idea to use kolstring instead of string.