Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > AnsiString, "+=" и Memo... тормоза!


Автор: BreakPointMAN 11.9.2005, 19:31
Трабла такая... программно нужно сформировать текст и поместить его в Memo... как сие организовать с наименьшими тормозами? Код представляет собой грубо упрощенно такой цикл:
Код

   AnsiString t=""; 
   int max=100000;
   for(int i=0; i<max; i++)
      {
       t+=(IntToStr(i)+"   "+IntToStr(i)+"\r\n");
      }

с каждой итерацией тормозит все сильнее и сильнее...

Автор: BreakPointMAN 11.9.2005, 19:45
ну ясен хрен... а что же я хотел... итак накладных расходов на постоянное увелечени строки, так еще... мдя...
Код

   AnsiString t=""; 
   int max=100000;
   AnsiString tmp;
   for(int i=0; i<max; i++)
      {
       tmp=(IntToStr(i)+"   "+IntToStr(i)+"\r\n");
       t+=tmp;
      }

Автор: JackYF 12.9.2005, 23:28
лучше сформируй char* массив:
запомни начальную позицию,
а потом с каждой итерацией указатель инкрементируй на какое-то число (какое-решай сам).
Добавление организуй строковыми функциями, а затем восстанови указатель и переведи потом в AnsiString. Если не очень понятно, могу (потом) написать поподробнее...

Автор: JackYF 12.9.2005, 23:55
Все, дошел до решения:

Код

char* t=new char[10000000];
   t[0]='\0';
   char* m=t;
   long max=100000;
   AnsiString tmp;
   for(long i=0; i<max; i++)
   {
      tmp=(IntToStr(i)+"   "+IntToStr(i)+"\r\n");
      strcat(t,tmp.c_str());
      t+=tmp.Length();
   }
   AnsiString result=m;
   t=m;
   delete [] t;


Вроде все работает. У меня (Athlon 2500+) -- около секунды. Устраивает?
Добавлено @ 00:04
Пардон, у тебя второй текст программы - то же самое...
Извиняюсь...

Только никак не могу понять - чем же принципиально отличаются твои 2 варианта?

Автор: Mayk 13.9.2005, 06:24
Цитата(JackYF @ 13.9.2005, 03:55)
tmp=(IntToStr(i)+"  "+IntToStr(i)+"\r\n");
      strcat(t,tmp.c_str());

Я б sprintf использовал. Чтоб сразу в t строку писать числа:
Код

t+=sprintf(t,"%d  %d\n",i,i);

Кстати, в примере JackYF вместо strcat'а надо использовать strcpy. Иначе ой - массив то не занулен, и в любой момент времени в t содержится любой содержимое. К которому strcat и будет прибавлять.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)