powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / StringReplace
4 сообщений из 4, страница 1 из 1
StringReplace
    #33591634
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Специально для LordMad, в продолжение вот этого http://www.sql.ru/forum/actualthread.aspx?tid=269693 :)

Навеяно несовершенством StringReplace от бормана.

Собственно функция замены:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
inline void MyCopy(AnsiString &Ret,char *cs,int n,int &LRet)
{
  int RetLength=Ret.Length();
  if (RetLength<LRet+n) Ret.SetLength(RetLength+ 2 *n);
  memcpy(Ret.c_str()+LRet,cs,n);
  LRet+=n;
}
AnsiString MyStringReplaceAll(AnsiString s,AnsiString f,AnsiString r)
{
  int sL=s.Length();
  int fL=f.Length();
  int rL=r.Length();

  AnsiString Ret;
  Ret.SetLength(sL);
  int LRet= 0 ;
  
  char *cs=s.c_str();
  char *csL=cs+sL;
  char *cf=f.c_str();
  char *cr=r.c_str();
  
  do
  {
    char *cs_found=StrPos(cs,cf);
    if (!cs_found)
    {
      MyCopy(Ret,cs,csL-cs,LRet);
      cs=csL;
    }
    else
    {
      MyCopy(Ret,cs,cs_found-cs,LRet);
      MyCopy(Ret,cr,rL,LRet);
      cs=cs_found+fL;
    }
  }while(cs<csL);

  Ret.SetLength(LRet);
  return Ret;
}
а это как мерял, чтобы вопросов не было
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  AnsiString SrcString=Edit3->Text;
  AnsiString Find=Edit5->Text;
  AnsiString Replace=Edit6->Text;
  int N=Edit7->Text.ToInt();
  int StartTime1=GetTickCount();
  for(int i= 0 ;i<N;i++) MyStringReplaceAll(SrcString,Find,Replace);
  int EndTime1=GetTickCount();
  int StartTime2=GetTickCount();
  for(int i= 0 ;i<N;i++) StringReplace(SrcString,Find,Replace,TReplaceFlags()<<rfReplaceAll);
  int EndTime2=GetTickCount();
  ShowMessage(IntToStr(EndTime1-StartTime1)+"\r\n"+IntToStr(EndTime2-StartTime2));
}
поэкспериментировал немного :)
исходная строка ~ 5кбайт
подстрока для поиска 3 байта
строка замены 247 байт
число замен ~ 500

моя функция 3 265 мс
бормановская 152 016 мс
разница в 50 раз примерно, т.е. можно подобрать входные параметры и чтобы в 100 раз быстрее получилось :)

сейчас увеличил строку замены вдвое и число замен тоже вдвое, ждемс .... уже 17 с половиной минут :) уверен, что бормана ждемс :)

повторю еще раз: код написан на коленке левый рукой, так что прошу особо не бить
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
StringReplace
    #33591642
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Карабас Барабасисходная строка ~ 5кбайт
подстрока для поиска 3 байта
строка замены 247 байт
число замен ~ 500

моя функция 3 265 мс
бормановская 152 016 мс
разница в 50 раз примерно, т.е. можно подобрать входные параметры и чтобы в 100 раз быстрее получилось :)

сейчас увеличил строку замены вдвое и число замен тоже вдвое, ждемс .... уже 17 с половиной минут :) уверен, что бормана ждемс :)ура, дождался:
StringReplace = 1 101 938 мс
MyStringReplaceAll = 12 406 мс

эх, еще чуть-чуть до 100 раз не дотянул :))
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
StringReplace
    #33592484
LordMAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если вхождений сделать мало (например, 10), а длину подстроки побольше (например, 100)
...
Рейтинг: 0 / 0
StringReplace
    #33592539
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Увеличил NewPattern (в терминах StringReplace) до 10к - не дождался, 2.5 часа работала - снял задачу. Ну его, бормана, нафик
LordMADА если вхождений сделать мало (например, 10), а длину подстроки побольше (например, 100)Я не нашел таких параметров, чтобы борман выиграл или хотя бы подтянулся поближе. А что у себя еще оптимизировать - пока не придумал. Разве что отказаться от библиотечной StrPos :)
Меня так-то заинтересовало твое утверждение, что ты видел реализацию StringReplace, которая в 100 раз быстрее была. Просто получается, в данном случае например, что различными значениями параметров можно получить большой разбег разницы в скорости.

как мерял ? чем мерял ?
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / StringReplace
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]