![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Загрузка в TStringList
Руслан © (2004-08-30 16:04:00)Может кто сталкивался, подскажите:
Присвоение свойству Text объекта TStringList при больших объемах присваиваемого текста (до сотни кб) происходит очень медленно из-за обработки разбиения на подстроки. Может кто уже переписывал метод SetTextStr для оптимизации? Подскажите способ.
GuAV (2004-08-30 22:53:00) [1]
> ой, лучше такое не делать особенно учитывая многокилобайтность
> такой строки...
Ещё тогда мысля. Загрузили - одна строка. Изменили где-то в середине - в месте изменения ломаем на две. Не думаю правда, что так когда-либо надо будет делать.
default (2004-08-30 20:56:00) [2]GuAV © (30.08.04 18:47) [16]
"> не превосходящие их по длине
а короче, то назад не сдвигать, пусть пробелы (ну то есть нули) будут. а сдвигать когде text просят."
это понятно...
"Выделить память SetLength и move'ом всю эту длинную строку поднять имел я ввиду. "
ой, лучше такое не делать особенно учитывая многокилобайтность такой строки...
P.S. надеюсь автору наше обсуждение поможет...
GuAV (2004-08-30 18:47:00) [3]
> всё равно придётся где-то сохранять затёртые байты других
> подстрок для чего есте-нно нужно будет выделить память...
Выделить память SetLength и move'ом всю эту длинную строку поднять имел я ввиду. А если
> не превосходящие их по длине
а короче, то назад не сдвигать, пусть пробелы (ну то есть нули) будут. а сдвигать когде text просят.
default (2004-08-30 18:17:00) [4]GuAV © (30.08.04 18:09) [14]
шутишь?это всё будет зашито в классе, загрузка будет моментальной, дальнейшая работа как обычно
GuAV (2004-08-30 18:09:00) [5]
> можно будет сделать что сначало используем только исходную
> строку
А ещё можно ваще запретить присвоение. Ну т.е. эксэпшн поднимать.
default (2004-08-30 18:02:00) [6]GuAV © (30.08.04 17:21) [12]
"а MOVE на что ?"
не поможет
всё равно придётся где-то сохранять затёртые байты других подстрок для чего есте-нно нужно будет выделить память...
можно будет сделать что сначало используем только исходную строку
потом при присв-ие данных какой-то подстроке использовать уже выделение памяти(использовать String с этого момента уже можно)
GuAV (2004-08-30 17:21:00) [7]
> при таком подходе можно будет записывать в подстроки только
> строки не превосходящие их по длине
а MOVE на что ?
> увы
> придётся писать отдельный класс для всего этого
имхо наследник TStrings
default (2004-08-30 16:47:00) [8]GuAV © (30.08.04 16:41) [10]
"только всё это не больно стыкуется, увы, с TStringList-ом"
при таком подходе можно будет записывать в подстроки только строки не превосходящие их по длине, увы
придётся писать отдельный класс для всего этого
GuAV (2004-08-30 16:41:00) [9]
> впрочем, тут по сути один вариант, а не два
Ха. Если правильно испольжуешь исходную строку, то при первой попытки записи в Strings[i] должа быть создана копия всё равно.
default (2004-08-30 16:36:00) [10]2)
скорость за счёт того что память выделяется одним разом
впрочем, тут по сути один вариант, а не два
GuAV (2004-08-30 16:35:00) [11]Фишка в том что TStringList ломает на строки, а не хранит куском. Быстрее чем уже сделать TStringList трудно, именно поэтому.
Если хошь что-то быстродобавляющее - свой наследник TStrings, тока тогда трудно будет сделать быструю сортировку.
посмотри также
TStringStream
default (2004-08-30 16:34:00) [12]asm не панацея
есть два пути для оптимизации
твоя длинная строка разбивается на подстроки путём выделения памяти под подстроки и заполнения их из исходной строки
1)использовать туже строку в качестве набора подстрок
каждая строка будет чем-то вроде PChar-а(или им самым)
то есть в 4 байтах под PChar будет храниться адрес_исходной строки+смещение_данной_подстроки_в_исходной_строке
2)не использовать исходную строку
то есть сформировать копию её и пункт 1)
только всё это не больно стыкуется, увы, с TStringList-ом
Руслан (2004-08-30 16:26:00) [13]ага
Есть альтернатива? А то на asm писать не хочется.
default (2004-08-30 16:25:00) [14]это всё SetString нехороший
Руслан (2004-08-30 16:19:00) [15]Если из текста предварительно вырезать #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;
pasha_golub (2004-08-30 16:14:00) [16]Не верю. Можно посмотреть как вы это считали? То есть кусок кода, который выдал такие результаты.
Руслан (2004-08-30 16:13:00) [17]Присвоение значения локальной переменной, хранящей несколько десятков кб текста, в свойство Text объекта TStringList на медленной машине происходит несколько секунд.
pasha_golub (2004-08-30 16:10:00) [18]А с чего вы решили, что происходит медленно именно из-за "разбиения на строки"?
Мне думается, что медленно может быть из-за чтения с диска.