Anstatt ein Zeichen in einer Zeit lesen und schreiben, lesen und schreiben sie alle auf einmal:
procedure WriteWideString(const ws: WideString; stream: TStream);
var
nChars: LongInt;
begin
nChars := Length(ws);
stream.WriteBuffer(nChars, SizeOf(nChars);
if nChars > 0 then
stream.WriteBuffer(ws[1], nChars * SizeOf(ws[1]));
end;
function ReadWideString(stream: TStream): WideString;
var
nChars: LongInt;
begin
stream.ReadBuffer(nChars, SizeOf(nChars));
SetLength(Result, nChars);
if nChars > 0 then
stream.ReadBuffer(Result[1], nChars * SizeOf(Result[1]));
end;
Nun, technisch gesehen, da WideString
ist ein Windows BSTR
, kann es enthält eine ungerade Anzahl der Bytes. Die Length
Funktion liest die Anzahl der Bytes und teilt sich durch zwei, so ist es möglich (obwohl nicht wahrscheinlich), dass der obige Code das letzte Byte abschneidet. Sie können diesen Code verwenden, anstatt:
procedure WriteWideString(const ws: WideString; stream: TStream);
var
nBytes: LongInt;
begin
nBytes := SysStringByteLen(Pointer(ws));
stream.WriteBuffer(nBytes, SizeOf(nBytes));
if nBytes > 0 then
stream.WriteBuffer(Pointer(ws)^, nBytes);
end;
function ReadWideString(stream: TStream): WideString;
var
nBytes: LongInt;
buffer: PAnsiChar;
begin
stream.ReadBuffer(nBytes, SizeOf(nBytes));
if nBytes > 0 then begin
GetMem(buffer, nBytes);
try
stream.ReadBuffer(buffer^, nBytes);
Result := SysAllocStringByteLen(buffer, nBytes)
finally
FreeMem(buffer);
end;
end else
Result := '';
end;
Inspiriert von Mghie's answer haben meine Read
und Write
Anrufe mit ReadBuffer
und WriteBuffer
ersetzt. Letzteres löst Ausnahmen aus, wenn sie die angeforderte Anzahl von Bytes nicht lesen oder schreiben können.
Ändern eines bestimmten Bereichs Ihres Codes, weil Sie * beli Eve * es könnte der Flaschenhals sein kann eine große Zeitverschwendung sein. Sie sollten zuerst messen, es gibt eine Menge von Werkzeugen, um Ihnen dort zu helfen, einige frei, einige kommerziell. Versuchen Sie diese zuerst für einige Verbindungen: http://stackoverflow.com/questions/291631/profiler-and-memory-analysis-tools-for-delphi und http://stackoverflow.com/questions/368938/delphi-profiling-tools – mghie
Danke, aber ich habe QueryPerformanceCounter verwendet, um das zu erkennen;) das war sowieso der Engpass, da das Lesen von char by char sehr langsam ist ... alle anderen Operationen haben nur einige kurze Binärdaten gespeichert. – migajek
Ah, OK.Ich reagierte gerade auf deine Verwendung der Wörter "glauben" und "Macht", sorry dann für das Predigen ;-) – mghie