Эффективность техники «начинается с подстроки» в Delphi? - PullRequest
6 голосов
/ 18 января 2012

Как сравнивается производительность этих двух способов определения, начинается ли строка с определенной подстроки в Delphi?Один из них значительно быстрее / эффективнее другого?

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

против

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

Ответы [ 3 ]

8 голосов
/ 18 января 2012

Ну, первое точно будет быстрее. Решение жестко запрограммированной, очень специфической проблемы почти всегда происходит намного быстрее, чем передача конкретного решения обычной процедуре решения проблемы. Что касается «значительно» быстрее, почему бы вам не проверить это? Запустите обе версии в цикле 10 миллионов раз и используйте TStopwatch (или что-то еще, если у вас нет D2010 или более поздней версии), чтобы рассчитать время.

Еще одна вещь: первая, безусловно, быстрее, но она также может быть неправильной. Если length(TestString) не гарантированно будет> = 2, здесь может возникнуть условие ошибки. Если TestString - пустая строка, это вызовет исключение. Если нет, вы можете или не можете получить исключение в зависимости от настроек компилятора.

4 голосов
/ 18 января 2012

Если вам нужна скорость с гибкостью, вы можете попробовать что-то вроде:

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 голосов
/ 18 января 2012

Первое в окне ЦП - это просто mov, cmp и jnz (в конечном итоге повторяется один раз), в то время как второе выглядит намного сложнее (использует Copy и WinApi CompareString). Сначала должно быть быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...