我有一个令人费解的结果,我很难理解。
我一直试图提高这个例程的速度
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;
答案 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
,这是对外部代码的唯一调用)