![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Скорость чтения и обработки из файла [D7]
ванъка © (2008-07-26 12:41:00)У меня есть собственный формат файла в котором я храню маленькие картинки (общий размер файла с картинками - 150 Кб), там около 60 картинок.
Формат файла:
заголовок с указанием кол-ва картинок в файле
а дальше идет необходимое кол-во картинок у каждой заголовок:
тип картинки: Byte;
размер картинки: Int64;
дальше сами данные.
А в программе я считываю такой файл и в зависимости от типа картинки заполняю нужный ImageList. Но у меня проблема - загрука очень долгая - около 10 секунд, это нормально?
Считываю через TFileStream и TMemoryStream.
ванъка (2008-07-27 13:07:00) [1]
> Zlib в ней обнови.
Обновил.
Еще может знаете, внутри TPngImageList, при добавлении картинки внутрь (ну например чере тот же LoadFromStream) каждый раз вызывается процедура CopyPngs, которая абсолютно глупая, она каждый раз переводит заново все картинки в иконки, не только что добавленную переводит, а вообще все в цикле, от этого у меня и стали наблюдаться тормоза.
Но у меня что-то никак не получается переделать эту процедуру (CopyPngs) для того что бы она не проходила в цикле все картинки а только обновляла добавленную картинку.
tesseract (2008-07-26 18:24:00) [2]
> Библиоткеа эта права отменная я ее так менять не хотел..
> .
Zlib в ней обнови. Очень тормознутая либа, сам её недавно переписывал. Сделано грамотно, но по скорости шо ппц. И утечечки у неё неплохие. Народ не понимает, что стрbмы надо гасить по raise.
ванъка (2008-07-26 18:06:00) [3]Библиоткеа эта права отменная я ее так менять не хотел... И вот, в наборе был кроме TPngImageList еще один любопытный объект — TPngImageCollection (это тоже типа TPngImageList, но может хранить в себе картинки различных размеров), ну я и решил его испробовать. Попробовал добавить в него — моментально добавляется.
Стал копать в исходниках, и нашел интересное место: оказывается при добавлении картинки в TPngImageList, он автоматически делает для копию в другую отрисовку какую то и маску для нее (я не вникал в суть). Я убрал это место и о чудо, у меня все моментально грузиться и работает.
Надо только теперь проверить все ли всегда будет зорошо без убранного мною кода. Всем спасибо кто помогал!
ванъка (2008-07-26 17:12:00) [4]Ну вообщем видимо тупость где-то внутри этой библиотеки PNG, не ожидал честно говоря от нее такого.
Я заменил в моем коде LoadFromStream на LoadFromFile и в цикле просто загружал одну и туже картинку с жесткого диска напрямую, ну и это заняло ~4500 мс.
Вот такие вот дела. Буду искать другую библиотеку наверное.
{RASkov} (2008-07-26 16:52:00) [5]> [11] ванъка (26.07.08 16:39)
> Возможно конечно и внутри нее тормоза, но мне кажется что
> это хорошая библиотека и тормоза где-то у меня.
наивный :) Хотя точка зрения вполне в праве... и я с ней согласен. Т.е. прежде чем кого-либо винить, ищи грех у себя....
Но тут вроде как все указывает на класс TPngImageList, так как ты говоришь, что комментируешь всего лишь одну строчку с "чужим" кодом и это сказывается на скорости, то тут и нужно разбирать данную строчку.... имхо.
Смотри метод PngImages. Addи еще бы, я внимательно обратил внимание на MS. Что в нем на момент PngImage.LoadFromStream(MS);.
ванъка (2008-07-26 16:39:00) [6]
> А ты случаем не с дискеты читаешь ? :)
Нет, читаю с жесткого диска.
> Что за TPngImageList? Получается, что в его коде - тормоза.
TPngImageList — из библиотеки PngComponents: http://www.thany.org/article/18/VCL
Возможно конечно и внутри нее тормоза, но мне кажется что это хорошая библиотека и тормоза где-то у меня.
> подозрительно, хотя подозрения могут быть только визуально)
> Я в плане Assign
Я изменил код, убал этот PngObj и сделал именно так:Images[ImgType].PngImages.Add.PngImage. LoadFromStream(MS);,
кроме того по совету выше убрал из цикла MS.Create / Free, но это совсем никак не сказалоь на скорости выполнения. (ну теперь ~2900 мс).
{RASkov} (2008-07-26 16:17:00) [7]> [8] ванъка (26.07.08 15:54)
> в месте добавления изображения из MemoryStream в image-лист.
> Без этого добавления вся операция занимает ~10 мс.
Ну значит "ошибочное" место там...
> Images — это массив сосотоящий из специальных листов: TPngImageList.
Что за TPngImageList? Получается, что в его коде - тормоза.
И вообще как-то вот это:
> Images[ImgType].PngImages.Add.PngImage := PngObj;
> finally
> PngObj.Free;
подозрительно, хотя подозрения могут быть только визуально) Я в плане Assign
...или например вообще убрать
> PngObj := TPNGObject.Create;
....
PngObj.Free;
А сделать так:
if Length(Images) - 1 >= ImgType then
Images[ImgType].PngImages.Add. PngImage.LoadFromStream(MS);
Riply (2008-07-26 16:15:00) [8]> [0] ванъка (26.07.08 12:41)
> У меня есть собственный формат файла в котором я храню маленькие картинки
> (общий размер файла с картинками - 150 Кб), там около 60 картинок.
А ты случаем не с дискеты читаешь ? :)
P.S.
Алгоритм загрузки плохой - переделай (вынеси все из цикла, например TMemoryStream.Create, PngObj := TPNGObject.Create;).
ванъка (2008-07-26 15:54:00) [9]Специально для тестов делал новый-чистый проект, в нем одна только процедура загрузки из файла и добавления в image-листы. У меня тормозит только в одном месте — в месте добавления изображения из MemoryStream в image-лист. Без этого добавления вся операция занимает ~10 мс.
> Как остальное-то ПО работает? не тормозит?
Ну так конечно подтормаживает, но у меня открыта только сама delphi и больше никаких процессов вроде файерволлов и антивирусов. В таком случае под delphi спокойно можно работать.
{RASkov} (2008-07-26 15:44:00) [10]Да и ось тяжеловата для твоей машинки.... имхо.
Как остальное-то ПО работает? не тормозит?
{RASkov} (2008-07-26 15:41:00) [11]> [5] ванъка (26.07.08 15:29)
> ~3000 мс. Как по вашему - это уже нормально или нет?
Много :) т.е. долго...
Для 150 Кб... причем из файла своего формата... т.е. структурированного(адаптированного) для своих задач...
:о)
Может у тебя в момент загрузки еще какие действия происходят, например визуализация той самой загрузки с математическими расчетами чего либо...
ванъка (2008-07-26 15:29:00) [12]Я посмотрел про свой TPngImageList и внес изменения в код загрузки, и засек через GetTickCount время исполнения, получилось в два раза быстрее.
Для нового алгоритма получилось общее время обработки: ~3000 мс. Как по вашему - это уже нормально или нет?
ванъка (2008-07-26 14:46:00) [13]Начинает все тормозить (долго загружать) в этом месте:
Images[ImgType].PngImages.Add.PngImage := PngObj;
т.е. без этой строчки считывание происходит буквально за секунду, значит со считыванием с жесткого диска все ок. Проблема в заполнении Images. Images — это массив сосотоящий из специальных листов: TPngImageList.
Что бы попробовать исправить?
> ОС какая?
2003
Loginov Dmitry (2008-07-26 14:05:00) [14]> Ну у меня старый компьютер (P-III, 128 Мб оперативки), но
> мне кажется, что это все равно долго для считывания данных.
>
> Что может быть плохо в моем коде? (тут приведен сам алгоритм
> считывания)
подозреваю, что основное время уходит на
PngObj := TPNGObject.Create;
try
PngObj.LoadFromStream(MS);
if Length(Images) - 1 >= ImgType then
Images[ImgType].PngImages.Add.PngImage := PngObj;
finally
PngObj.Free;
end;
хотя если компьютер старенький, не исключены тормоза с жестким диском.
ОС какая?
ванъка (2008-07-26 13:25:00) [15]Ну у меня старый компьютер (P-III, 128 Мб оперативки), но мне кажется, что это все равно долго для считывания данных.
Что может быть плохо в моем коде? (тут приведен сам алгоритм считывания)
for i := 0 to ImagesCount - 1 do
begin
FS.Read(ImageHdr, SizeOf(TThemeBinaryHdr));
MS := TMemoryStream.Create;
try
with ImageHdr do
begin
MS.CopyFrom(FS, ImgSize);
MS.Seek(0, soFromBeginning);
PngObj := TPNGObject.Create;
try
PngObj.LoadFromStream(MS);
if Length(Images) - 1 >= ImgType then
Images[ImgType].PngImages.Add.PngImage := PngObj;
finally
PngObj.Free;
end;
end;
finally
MS.Free;
end;
end;
{RASkov} (2008-07-26 13:17:00) [16]> [0] ванъка (26.07.08 12:41)
> загрука очень долгая - около 10 секунд, это нормально?
Просто считать 150 кб данных и разместить их по разным контейнерам за такое время на современных компьютерах - не нормально. Т.е. долго...