字符串比较的效率(50分)

  • 主题发起人 主题发起人 bin_75
  • 开始时间 开始时间
B

bin_75

Unregistered / Unconfirmed
GUEST, unregistred user!
请问各位高人在看字符串是为空时
是length(s)>0效率高呢还是 s>''的效率高?
 
s <> '' 效率高吧!

procedure TForm1.Button1Click(Sender: TObject);
var
I :Integer;
sStr :String;
sText :String;
dwRunTick :LongWord;
begin
sStr := 'Goods';

dwRunTick := GetTickCount;
for I := 0 to 100000000 do
if sStr <> '' then ;

sText := IntToStr(GetTickCount - dwRunTick) + ' - ';

dwRunTick := GetTickCount;
for I := 0 to 100000000 do
if Length(sStr) > 0 then ;

sText := sText + IntToStr(GetTickCount - dwRunTick);
Caption := sText;
end;
 
<我爱Delphi>回答很正确, 实践检验真理的方法也不错;

其实, Delphi编译器对字符串为空的检测(比较)做了优化, 缺省编译环境下(使用huge strings//长字符串), 使用 str<>''速度快过length(str)>0;
短字符串的时候, str<>'' 与 length(str)>0的速度是一样的 // 内部都是用 str[0]>#0来检测的
 
var
s: string;
begin
s := '';
if s ='' then
begin

end;
if length(s) = 0 then
begin

end;
end;
Unit1.pas.30: s := '';
004564AB 8D45FC lea eax,[ebp-$04]
004564AE E861E3FAFF call @LStrClr
Unit1.pas.31: if s ='' then
004564B3 837DFC00 cmp dword ptr [ebp-$04],$00 //看看s是不是空指针即可
Unit1.pas.35: if length(s) = 0 then
004564B7 8B45FC mov eax,[ebp-$04]
004564BA 85C0 test eax,eax
004564BC 7405 jz $004564c3
004564BE 83E804 sub eax,$04 //先判断不是空的情况下取地址的-4偏移处的长度
004564C1 8B00 mov eax,[eax]
004564C3 85C0 test eax,eax
 
当然是 s>''
 
多人接受答案了。
 
后退
顶部