Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Быстрый вывод большого количества инфы в МЕМО 
:(
    Опции темы
sabbatazh
  Дата 17.7.2008, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 17.7.2008

Репутация: нет
Всего: нет



Здравствуйте, Все!!!!

Я зашел в тупик...  smile .... читаю блоками из нескольких фалов, большого размера, определнного размера значения и вывожу в несколько компонентов МЕМО... - это происходит медленно .... переделал это под потоки - запускаю несколько потоков (class(TThread)), процесс вывода ускорился... но не существенно... 
Если есть возможность быстрого вывода инфы в МЕМО, то пожскажите плиз.... !!!!!!!!!!!
Может использовать TFileStream?! Покажите пример как использовать механизм функции BlockRead в TFileStream.... 

Заранее Благодарю!!!! smile 
PM MAIL   Вверх
aleksh
Дата 17.7.2008, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 609
Регистрация: 8.7.2008

Репутация: 3
Всего: 13



основная проблема со скоростью, зачастую, связана с визуальным компонентом, в данном случае прорисовка в мемо, отсюда предложение: может данные выводить в мемо не сразу после прочтения; хранить их в какой-то временной структуре (вроде кэша будет), и выводить периодическу структуру. то есть: прочел раз пять-шесть-больше -- вывел в мемо, кэш очистил...
а считывать надо именно блоками?
PM MAIL   Вверх
sabbatazh
Дата 17.7.2008, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 17.7.2008

Репутация: нет
Всего: нет



ДА... вот именно шо тока блоками....

читаю через буфер (массив)....

Это сообщение отредактировал(а) sabbatazh - 17.7.2008, 17:44
PM MAIL   Вверх
dumb
Дата 22.7.2008, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 13
Всего: 158



попробуй воспользоваться советом, приведенным в конце этого поста.
PM MAIL   Вверх
Jek1975
  Дата 1.3.2009, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 26.5.2008

Репутация: нет
Всего: нет



Кто-нибудь может объяснить почему первый вариант кода выполняется почти в 10 рез медленнее, чем второй вариант?
Что нужно сделать чтобы первый вариант выполнялся так же быстро?

Код

var i:integer;
....
Memo1.Lines.BeginUpdate;
 for i:=0 to 100000 do
    Memo1.Lines.Add('Тест A. Строка №'+IntToStr(i));
 Memo1.Lines.EndUpdate;


Код

var L:tStringList; i:integer;
....
L:=tStringList.Create;

 for i:=0 to 100000 do
    L.Add('Тест B. Строка №'+IntToStr(i));

 L.SaveToFile('test.txt');
 L.Free;

 Memo1.Lines.BeginUpdate;
 Memo1.Lines.LoadFromFile('test.txt');
 Memo1.Lines.EndUpdate;

PM MAIL WWW ICQ   Вверх
Christoph
Дата 1.3.2009, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 667
Регистрация: 23.1.2008
Где: Харьков

Репутация: 1
Всего: 11



Код

Memo1.Lines.BeginUpdate;
  for i := 1 to 5000 do
    Memo1.Lines.Add('abcd');
Memo1.Lines.EndUpdate;


»  without BeginUpdate/EndUpdate: 25 seconds...
»  with BeginUpdate/EndUpdate: 0.6 seconds!

http://www.festra.com/eng/tip-beginupdate.htm

в 1 примере никак не увеличишь скорость, ну можешь себе комп быстрее поставить smile

во втором примере BeginUpdate EndUpdate смысловой нагрузки не несет, так как что с этими методами что без них (BeginUpdate EndUpdate), мемо перерисуется 1 раз

Это сообщение отредактировал(а) Christoph - 1.3.2009, 18:28


--------------------
user posted image
PM MAIL ICQ   Вверх
Jek1975
Дата 1.3.2009, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 26.5.2008

Репутация: нет
Всего: нет



Christoph

Если не заметно что BeginUpdate и EndUpdate у меня в коде ЕСТЬ, то запусти пример из вложения, и убедись, что не в них дело.

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  Proj_Lines.zip 3,63 Kb
PM MAIL WWW ICQ   Вверх
Christoph
Дата 1.3.2009, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 667
Регистрация: 23.1.2008
Где: Харьков

Репутация: 1
Всего: 11



вот убери в 1 коде BeginUpdate и посмотри сколько будет выполняться, и во втором убери BeginUpdate, если во втором разницы не почувствуешь, а вот в первом почуствуешь  smile 


--------------------
user posted image
PM MAIL ICQ   Вверх
Jek1975
Дата 1.3.2009, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 26.5.2008

Репутация: нет
Всего: нет



Christoph, извини, чувак, у меня конечно есть некоторый запас терпения, но я НЕ спрашиваю как замедлить код, я спрашиваю, что нужно сделать, чтобы оба куска выполнялись одинаково быстро. Если не знаешь, то лучше, пожалуйста, не отвечай.

Последний раз показываю что BeginUpdate и EndUpdate в моем примере НИКАК не способствуют тому, чтобы время выполнения обоих кусков сравнялось!!!

                     Memo [сек]    StringList+Memo [сек]
с Updates       10,910                  1,284
без Updates   58,990                  1,346


PM MAIL WWW ICQ   Вверх
MetalFan
Дата 1.3.2009, 19:35 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Jek1975, так, спокойнее! чувак, не гни пальцы, а то сломаешь.
по теме: при LoadFromXXX BeginUpdate/EndUpdate вызывать нет необходимости, ибо они и так вызываются в TStirngs.LoadFromStream.
для ускорения загрузки в Мемо имеет смысл не добавлять по одной строчке, а грузить их "скопом" из потока.


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Jek1975
Дата 1.3.2009, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 26.5.2008

Репутация: нет
Всего: нет



MetalFan, получется что не существует никаких других способов ускорения, кроме LoadFrom...?
Тогда как это реализовать в программе наиболее правильным способом?

Если я правильно понял, то в своем объекте, из которого я могу получить список строк (которые можно создать только в цикле) нужно делать не так:
Код

tMyDataStorage = class(TObject)
 public
    procedure GetText (var Lines:tStrings);
 end;

а так:
Код

tMyDataStorage = class(TObject)
 public
   GetText:TStream;
 end;

И вызывать не, MyDataStorage.GetText (Memo1.Lines) 
,а Memo1.Lines.LoadFromStream (MyDataStorage.GetText);

Я Вас правильно понял?

Извините, если понял что-то не так ...я только использовал готовые потоки (файлы), свои не создавал. Поэтому и спрашиваю насчёт правильности их использования.

Это сообщение отредактировал(а) Jek1975 - 1.3.2009, 20:39
PM MAIL WWW ICQ   Вверх
MetalFan
Дата 1.3.2009, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



на самом деле можно провести эксперимент...
нет, я был не прав. судя по коду TStrings(TMemoStrings) что загрузка из TStream, что из другого TStrings один фиг в итоге вызывает TStrings.Insert для КАЖДОЙ строки. следует заметить, что и Assign и LoadFromStream делают сами внутри себя BeginUpdate/EndUpdate.
а что, если попробовать загрузить текст в мемо через TMemo.Lines.Text := ... или TControl.SetTextBuf...


Это сообщение отредактировал(а) MetalFan - 1.3.2009, 21:11


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0535 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.