Существует ли быстрая процедура GetToken для Delphi?

В моей программе я обрабатываю миллионы строк, которые имеют специальный символ, например, "|" разделять токены внутри каждой строки. У меня есть функция для возврата n 'и вот оно:

function GetTok(const Line: string; const Delim: string; const TokenNum: Byte): string;
{ LK Feb 12, 2007 - This function has been optimized as best as possible }
var
 I, P, P2: integer;
begin
  P2 := Pos(Delim, Line);
  if TokenNum = 1 then begin
    if P2 = 0 then
      Result := Line
    else
      Result := copy(Line, 1, P2-1);
  end
  else begin
    P := 0; { To prevent warnings }
    for I := 2 to TokenNum do begin
      P := P2;
      if P = 0 then break;
      P2 := PosEx(Delim, Line, P+1);
    end;
    if P = 0 then
      Result := ''
    else if P2 = 0 then
      Result := copy(Line, P+1, MaxInt)
    else
      Result := copy(Line, P+1, P2-P-1);
  end;
end; { GetTok }

Я разработал эту функцию еще тогда, когда использовал Delphi 4. Она вызывает очень эффективную процедуру PosEx, которая была изначально разработана Fastcode и теперь включена в библиотеку StrUtils Delphi.

Я недавно обновился до Delphi 2009, и все мои строки - Unicode. Эта функция GetTok все еще работает и работает хорошо.

Я ознакомился с новыми библиотеками в Delphi 2009, и в нем много новых функций и дополнений.

Но я не видел функцию GetToken, которая мне нужна, ни в одной из новых библиотек Delphi, в различных проектах fastcode, и я могу 'найти с помощью поиска Google ничего, кромеЗарко Гайичs: Delphi Split / Tokenizer Функции, который не так оптимизирован, как у меня уже есть.

Любое улучшение, даже 10%, было бы заметно в моей программе. Я знаю, что альтернативой является StringLists и всегда держать токены отдельно, но это имеет большие накладные расходы памяти, и я 'Я не уверен, если бы я сделал всю эту работу, чтобы преобразовать это будет быстрее.

Уф. Итак, после всего этого многословного разговора мой вопрос на самом деле таков:

Знаете ли вы какие-либо очень быстрые реализации подпрограммы GetToken? Оптимизированная версия на ассемблере была бы идеальной?

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

Продолжение: Барри Келли упомянул вопрос, который я задал год назад об оптимизации разбора строк в файле. В то время я не имелЯ даже не думал о моей подпрограмме GetTok, которая не использовалась для чтения или анализа. Только теперь я увидел накладные расходы на мою процедуру GetTok, которая заставила меня задать этот вопрос. До Карла Смотрича и БарриОтветы, я никогда не думал о соединении двух. Так очевидно, но это просто нет зарегистрироваться. Спасибо что подметил это.

Да, мой Delim представляет собой один символ, поэтому, очевидно, у меня есть несколько важных возможностей для оптимизации. Мое использование Pos и PosEx в подпрограмме GetTok (см. Выше) ослепило меня тем, что я могу сделать это быстрее с помощью посимвольного поиска вместо этого с помощью кусочков кода, подобных: I '

      while (cp^ > #0) and (cp^ 

Ответы на вопрос(7)

Ваш ответ на вопрос