如何正确使用PChars来改善此优化?
|
我有一个在我的应用中被大量调用的函数。它基本上是一个csv解析器,它会“弹出”第一个值,然后将输入字符串更改为其余字符串。
function StripString(mask: string; var modifiedstring: string): string;
var
index,len: integer;
s: string;
begin
Index := pos(Mask, ModifiedString);
len := Length(ModifiedString);
if index <> 0 then
begin
if Index <> 1 then
begin
s := LeftStr(ModifiedString, index - 1);
ModifiedString := RightStr(ModifiedString, len-index);
end else begin
if Length(ModifiedString)>1 then
ModifiedString := Copy(ModifiedString,2,len)
else
ModifiedString := \'\';
s := \'\';
end;
end else begin
s := ModifiedString;
ModifiedString := \'\';
end;
result := s
end;
我想尝试使用PChars优化此例程。所以我想出了这种方法,但是不幸的是我在输出结果中得到了奇怪的字符。我猜测是因为指针不正确。
//faster method - uses PChars
function StripStringEx(mask: char; var modifiedstring: string): string;
var
pSt,pCur,pEnd : Pchar;
begin
pEnd := @modifiedString[Length(modifiedString)];
pSt := @modifiedString[1];
pCur := pSt;
while pCur <= pEnd do
begin
if pCur^ = mask then break;
inc(pCur);
end;
SetString(Result,pSt,pCur-pSt);
SetString(ModifiedString,pCur+1,pEnd-pCur);
end;
有人“指向” :)我朝着正确的方向前进吗?
没有找到相关结果
已邀请:
2 个回复
究补闯
比循环快,因为faster2ѭ得到了合理的优化。两种版本的分配模式相同,分别是两个堆分配和一个堆释放。我会坚持使用该版本。 您可以摆脱局部变量
,直接将其分配给
,以跳过一些引用计数。
伞腹