Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.12;
Скачать: CL | DM;

Вниз

Загрузка в TStringList   Найти похожие ветки 

 
Руслан   (2004-08-30 16:04) [0]

Может кто сталкивался, подскажите:
Присвоение свойству Text объекта TStringList при больших объемах присваиваемого текста (до сотни кб) происходит очень медленно из-за обработки разбиения на подстроки. Может кто уже переписывал метод SetTextStr для оптимизации? Подскажите способ.


 
pasha_golub ©   (2004-08-30 16:10) [1]

А с чего вы решили, что происходит медленно именно из-за "разбиения на строки"?

Мне думается, что медленно может быть из-за чтения с диска.


 
Руслан   (2004-08-30 16:13) [2]

Присвоение значения локальной переменной, хранящей несколько десятков кб текста, в свойство Text объекта TStringList на медленной машине происходит несколько секунд.


 
pasha_golub ©   (2004-08-30 16:14) [3]

Не верю. Можно посмотреть как вы это считали? То есть кусок кода, который выдал такие результаты.


 
Руслан   (2004-08-30 16:19) [4]

Если из текста предварительно вырезать #10 и #13, то присовение происходит мгновенно. Все дело в обработке разбивки на строки в SetTextStr:
   P := Pointer(Value);
   if P <> nil then
     while P^ <> #0 do
     begin
       Start := P;
       while not (P^ in [ #0, #10, #13]) do Inc(P);
       SetString(S, Start, P - Start);
       Add(S);
       if P^ = #13 then Inc(P);
       if P^ = #10 then Inc(P);
     end;


 
default ©   (2004-08-30 16:25) [5]

это всё SetString нехороший


 
Руслан   (2004-08-30 16:26) [6]

ага
Есть альтернатива? А то на asm писать не хочется.


 
default ©   (2004-08-30 16:34) [7]

asm не панацея
есть два пути для оптимизации
твоя длинная строка разбивается на подстроки путём выделения памяти под подстроки и заполнения их из исходной строки
1)использовать туже строку в качестве набора подстрок
каждая строка будет чем-то вроде PChar-а(или им самым)
то есть в 4 байтах под PChar будет храниться адрес_исходной строки+смещение_данной_подстроки_в_исходной_строке
2)не использовать исходную строку
то есть сформировать копию её и пункт 1)
только всё это не больно стыкуется, увы, с TStringList-ом


 
GuAV ©   (2004-08-30 16:35) [8]

Фишка в том что TStringList ломает на строки, а не хранит куском. Быстрее чем уже сделать TStringList трудно, именно поэтому.

Если хошь что-то быстродобавляющее - свой наследник TStrings, тока тогда трудно будет сделать быструю сортировку.

посмотри также
TStringStream


 
default ©   (2004-08-30 16:36) [9]

2)
скорость за счёт того что память выделяется одним разом
впрочем, тут по сути один вариант, а не два


 
GuAV ©   (2004-08-30 16:41) [10]


> впрочем, тут по сути один вариант, а не два

Ха. Если правильно испольжуешь исходную строку, то при первой попытки записи в Strings[i] должа быть создана копия всё равно.


 
default ©   (2004-08-30 16:47) [11]

GuAV ©   (30.08.04 16:41) [10]
"только всё это не больно стыкуется, увы, с TStringList-ом"
при таком подходе можно будет записывать в подстроки только строки не превосходящие их по длине, увы
придётся писать отдельный класс для всего этого


 
GuAV ©   (2004-08-30 17:21) [12]


> при таком подходе можно будет записывать в подстроки только
> строки не превосходящие их по длине

а MOVE на что ?
> увы
> придётся писать отдельный класс для всего этого

имхо наследник TStrings


 
default ©   (2004-08-30 18:02) [13]

GuAV ©   (30.08.04 17:21) [12]
"а MOVE на что ?"
не поможет
всё равно придётся где-то сохранять затёртые байты других подстрок для чего есте-нно нужно будет выделить память...
можно будет сделать что сначало используем только исходную строку
потом при присв-ие данных какой-то подстроке использовать уже выделение памяти(использовать String с этого момента уже можно)


 
GuAV ©   (2004-08-30 18:09) [14]


> можно будет сделать что сначало используем только исходную
> строку

А ещё можно ваще запретить присвоение. Ну т.е. эксэпшн поднимать.


 
default ©   (2004-08-30 18:17) [15]

GuAV ©   (30.08.04 18:09) [14]
шутишь?это всё будет зашито в классе, загрузка будет моментальной, дальнейшая работа как обычно


 
GuAV ©   (2004-08-30 18:47) [16]


> всё равно придётся где-то сохранять затёртые байты других
> подстрок для чего есте-нно нужно будет выделить память...

Выделить память SetLength и move"ом всю эту длинную строку поднять имел я ввиду. А если
> не превосходящие их по длине

а короче, то назад не сдвигать, пусть пробелы (ну то есть нули) будут. а сдвигать когде text просят.


 
default ©   (2004-08-30 20:56) [17]

GuAV ©   (30.08.04 18:47) [16]
"> не превосходящие их по длине
а короче, то назад не сдвигать, пусть пробелы (ну то есть нули) будут. а сдвигать когде text просят."
это понятно...
"Выделить память SetLength и move"ом всю эту длинную строку поднять имел я ввиду. "
ой, лучше такое не делать особенно учитывая многокилобайтность такой строки...
P.S. надеюсь автору наше обсуждение поможет...


 
GuAV ©   (2004-08-30 22:53) [18]


> ой, лучше такое не делать особенно учитывая многокилобайтность
> такой строки...

Ещё тогда мысля. Загрузили - одна строка. Изменили где-то в середине - в месте изменения ломаем на две. Не думаю правда, что так когда-либо надо будет делать.



Страницы: 1 вся ветка

Текущий архив: 2004.09.12;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.039 c
1-1093383869
mouse_web
2004-08-25 01:44
2004.09.12
Очистка Image


3-1092577113
Ольга
2004-08-15 17:38
2004.09.12
Формирование SQL-скрипта на создание таблицы из программы


1-1093405354
COOLer
2004-08-25 07:42
2004.09.12
DataSet to XML


14-1093436613
Darthman
2004-08-25 16:23
2004.09.12
Набираю людей (Надо один-два) для написания IDE для языка прогр.


8-1087797092
hogo
2004-06-21 09:51
2004.09.12
Timage