Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.032 c
8-1087910010
Chery
2004-06-22 17:13
2004.09.12
MediaPlayer. Как развернуть файл во весь экран?


1-1093429332
P@vel
2004-08-25 14:22
2004.09.12
Bufer


3-1092806801
fedor
2004-08-18 09:26
2004.09.12
Как грамотно обновить таблицу, запрос...


1-1093589718
anarhi
2004-08-27 10:55
2004.09.12
Label


4-1091106191
panov
2004-07-29 17:03
2004.09.12
Иконка в SysTray. PopupMenu





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский