Delphi中“以子串开始”技术的效率?

时间:2012-01-17 21:37:52

标签: performance delphi

这两种确定字符串是否以Delphi中的某个子字符串开头的方式的性能如何比较?一个比另一个明显更快/更有效吗?

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

VS

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

3 个答案:

答案 0 :(得分:8)

嗯,第一个肯定会更快。解决硬编码,高度特定的问题几乎总是比将特定解决方案传递给一般问题解决例程快得多。至于“显着”更快,你为什么不测试它?将这两个版本循环运行1000万次并使用TStopwatch(如果您没有D2010或更高版本,则使用其他版本)来计时。

另一件事:第一个肯定更快,但也可能是错误的。如果length(TestString)不能保证>> = 2,那么您可能会遇到错误情况。如果TestString是空字符串,则会引发异常。如果没有,您可能会或可能不会获得异常,具体取决于编译器设置。

答案 1 :(得分:4)

如果您需要具有灵活性的速度,可以尝试以下方式:

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;

答案 2 :(得分:2)

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