用PChar操作替换字符串赋值

时间:2016-02-29 09:59:47

标签: delphi delphi-10-seattle

我有一个令人费解的结果,我很难理解。

我一直试图提高这个例程的速度

function TStringRecord.GetWord: String;
begin
  // return the next word in Input
  Result := '';

  while (PC^ <> #$00) and not PC^.IsLetter do begin
    inc(FPC);
  end;

  while (PC^ <> #$00) and PC^.IsLetter do begin
    Result := Result + PC^;
    inc(FPC);
  end;
end;

通过基于指针的操作替换Result := Result + PC^。这个 是我的尝试:

function TStringRecord.GetWord2: String;
var
  Len : Integer;
  StartPC,
  DestPC : PChar;
begin
  // return the next word in Input
  Result := '';

  while (PC^ <> #$00) and not PC^.IsLetter do begin
    inc(FPC);
  end;

  Len := Length(Input);
  SetLength(Result, Len);
  StartPC := PChar(Result);
  DestPC := PChar(Result);
  while (PC^ <> #$00) and PC^.IsLetter do begin
    WStrPLCopy(DestPC, PC, 1);
    inc(FPC);
    inc(DestPC);
  end;
  SetLength(Result, DestPC - StartPC);
end;

根据我的线型分析器,WStrPLCopy(DestPC, PC, 1)需要50倍的时间 比Result := Result + PC^。据我所知,这是因为入境时 对WStrPLCopy的调用_WStrFromPWChar似乎复制了更多 字符比必要的字符。我怎样才能避免这种情况,或者有人可以建议 另一种基于PChar的方法?

我的代码的其余部分如下:

TStringRecord = record
private
  FPC: PChar;
  FInput: String;
  procedure SetInput(const Value: String);
public
  function NextWord : String;
  function NextWord2 : String;
  property Input : String read FInput write SetInput;
  property PC : PChar read FPC;
end;

procedure TStringRecord.SetInput(const Value: String);
begin
  FInput := Value;
  FPC := PChar(Input);
end;

1 个答案:

答案 0 :(得分:4)

这就是我写它的方式:

function TStringRecord.GetWord: String;
var beg: PChar;
begin
  // return the next word in Input
  while (FPC^ <> #0) and not FPC^.IsLetter do 
    inc(FPC);
  beg := FPC;
  while (FPC^ <> #0) and FPC^.IsLetter do 
    inc(FPC);
  SetString(result, beg, FPC-beg);
end;

有了这个,代码是非常易读的,你只有一个内存分配,我想你不能写得更快(但是通过内联PC^.IsLetter,这是对外部代码的唯一调用)