如何正确使用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;
有人“指向” :)我朝着正确的方向前进吗?
已邀请:
即使您使用了指针版本,我也看不出为什么它会更快。 调用
Pos
比循环快,因为faster2ѭ得到了合理的优化。两种版本的分配模式相同,分别是两个堆分配和一个堆释放。我会坚持使用该版本。 您可以摆脱局部变量
s
,直接将其分配给
Result
,以跳过一些引用计数。
我认为由于ModString上的SetString,您会得到奇怪的结果。 SetString首先设置字符串的长度,然后将内容从缓冲区复制到新创建的字符串。但是在您的情况下,缓冲区是目的地,并且缓冲区的长度刚刚被调整。 只要遵循David的建议,就不要使用PChars。 如果需要,可以将其缩短一些:
function StripString(const Mask: string; var ModifiedString: string): string;
var
  Index: Integer;
begin
  Index := Pos(Mask, ModifiedString);
  if Index <> 0 then
  begin
    Result := LeftStr(ModifiedString, Index - 1);
    Delete(ModifiedString, Index);
  end
  else
  begin
    Result := ModifiedString;
    ModifiedString := \'\';  
  end;
end;

要回复问题请先登录注册