德尔福"begins with substring"技术的效率?



在Delphi中,这两种确定字符串是否以某个子字符串开头的方法的性能如何比较?一个比另一个快/效率高吗?

  if ((testString[1] = '=') AND (testString[2] = '?')) then ...

与。

  if (AnsiStartsStr('=?', testString)) then ...

好吧,第一个肯定会更快。解决一个硬编码的、高度特定的问题几乎总是比将特定的解决方案传递给一般的问题解决程序快得多。至于"明显"更快,你为什么不测试一下呢?循环运行这两个版本1000万次,并使用TStopwatch(或者其他东西,如果你没有D2010或更高版本)来计时。

还有一件事:第一个肯定更快,但也可能是错误的。如果不能保证length(TestString)大于等于2,则此处可能存在错误条件。如果TestString是空字符串,则会引发异常。如果没有,根据编译器设置,您可能会也可能不会得到异常。

如果您需要速度和灵活性,可以尝试以下方法:

function StatsWith(const SubStr, Str: string): Boolean; inline;
begin
  if Length(SubStr) <= Length(Str) then
    Result := CompareMem(Pointer(SubStr), Pointer(Str), ByteLength(SubStr))
  else
    Result := False;
end;

CPU窗口中的第一个窗口只有movcmpjnz(最终重复一次),而第二个窗口看起来要复杂得多(使用Copy和WinApi的CompareString)。首先应该更快。

最新更新