比较部分字符串的最快方法?

时间:2009-08-15 14:32:24

标签: delphi string comparison delphi-2009

我必须将部分字符串“SKILL_______EU_______WAND_______CLERIC_______BASE_____01”与“SKILL”进行比较。这是为了检查前四个字符是否为“SKILL”。或仅限第一个字符,此处需要进行优化

我的问题:

  1. 我不知道如何进行优化比较。
  2. 必须重复35 000次,所以必须是非常 快。
  3. 谢谢!

10 个答案:

答案 0 :(得分:11)

对于区分大小写的StrUtils.AnsiStartsText使用StrUtils.AnsiStartsStr,不区分大小写  (将StrUtils添加到your uses子句中)

答案 1 :(得分:6)

现在35000次重复真的不是那么多,你做什么都没关系。

答案 2 :(得分:5)

如果你真的想要最好的速度,你必须自己写一点StartsWith功能。

// untested, case-sensitive
Function StartsWith(const find, text : string) : Boolean;
var i, len : integer;
begin
   result := true;
   len := Min(Length(find), Length(text));
   For i := 1 to len do
   Begin
     if (find[i] <> text[i]) 
     then begin
       result := False;
       break;
     end;
   End;   
end;

答案 3 :(得分:1)

我认为Delphi例程非常优化且快速,所以只需使用它们即可。

var
  position : Integer;

begin
  // AnsiPos
  //   returns the position of a substring in a string
  //   or 0 if the substring isn't found
  position := AnsiPos('SKILL', 'SKILL_______EU_______WAND_______CLERIC_______BASE_____01');
end;

答案 4 :(得分:1)

如果您只想检查第一个字符,可以这样做:

if 'S' = 'SKILL_______EU_______WAND_______CLERIC_______BASE_____01'[1] then
begin
    showmessage('SKILL');
end

答案 5 :(得分:1)

无论您选择哪种解决方案,请记住实际测试和基准它与您当前的实施。

否则你只是猜测,而不是优化。

请注意premature optimization is the root of all evil

祝你好运!

答案 6 :(得分:0)

我对Delphi了解不多,但我认为(在任何语言/框架/平台中)Regex是字符串扫描的最快方式......

您没有准确指定您要搜索的所有条件......

答案 7 :(得分:0)

为什么不这样做:

function StartsWith( const AMatchStr, ATestStr : string ) : boolean;
begin
  Result := SameText( AMatchStr, copy( ATestStr, 1, Length( AMatchStr ));
end;

除了您的起始文本之外,这不会处理ATestStr的任何部分。 BRI

答案 8 :(得分:0)

如果您正在查看可以执行的前4/5个字符的内容

i:= Length('SKILL');

LeftStr('SKILL_______EU_______WAND_______CLERIC_______BASE_____01',i) = 'SKILL'

答案 9 :(得分:0)

if AnsiPos('SKILL', 'SKILL_______EU_______WAND_______CLERIC_______BASE_____01') > 0 then

我认为这应该可以完成这项工作,我不知道AnsiPos的速度,如果速度快或慢或其他什么。每当我想比较一些字符串时,它对我有用。 AnsiPos()会返回一个整数值,该值表示您正在寻找的字符串的起始索引。