Форум: "Основная";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];
ВнизЗагрузка в 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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.035 c