Форум: "Начинающим";
Текущий архив: 2008.09.07;
Скачать: [xml.tar.bz2];
ВнизСкорость чтения и обработки из файла Найти похожие ветки
← →
ванъка (2008-07-26 12:41) [0]У меня есть собственный формат файла в котором я храню маленькие картинки (общий размер файла с картинками - 150 Кб), там около 60 картинок.
Формат файла:
заголовок с указанием кол-ва картинок в файле
а дальше идет необходимое кол-во картинок у каждой заголовок:тип картинки: Byte;
размер картинки: Int64;
дальше сами данные.
А в программе я считываю такой файл и в зависимости от типа картинки заполняю нужный ImageList. Но у меня проблема - загрука очень долгая - около 10 секунд, это нормально?
Считываю через TFileStream и TMemoryStream.
← →
{RASkov} © (2008-07-26 13:17) [1]> [0] ванъка (26.07.08 12:41)
> загрука очень долгая - около 10 секунд, это нормально?
Просто считать 150 кб данных и разместить их по разным контейнерам за такое время на современных компьютерах - не нормально. Т.е. долго...
← →
ванъка (2008-07-26 13:25) [2]Ну у меня старый компьютер (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;
← →
Loginov Dmitry © (2008-07-26 14:05) [3]> Ну у меня старый компьютер (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 14:46) [4]Начинает все тормозить (долго загружать) в этом месте:
Images[ImgType].PngImages.Add.PngImage := PngObj;
т.е. без этой строчки считывание происходит буквально за секунду, значит со считыванием с жесткого диска все ок. Проблема в заполнении Images. Images — это массив сосотоящий из специальных листов: TPngImageList.
Что бы попробовать исправить?
> ОС какая?
2003
← →
ванъка (2008-07-26 15:29) [5]Я посмотрел про свой TPngImageList и внес изменения в код загрузки, и засек через GetTickCount время исполнения, получилось в два раза быстрее.
Для нового алгоритма получилось общее время обработки: ~3000 мс. Как по вашему - это уже нормально или нет?
← →
{RASkov} © (2008-07-26 15:41) [6]> [5] ванъка (26.07.08 15:29)
> ~3000 мс. Как по вашему - это уже нормально или нет?
Много :) т.е. долго...
Для 150 Кб... причем из файла своего формата... т.е. структурированного(адаптированного) для своих задач...
:о)
Может у тебя в момент загрузки еще какие действия происходят, например визуализация той самой загрузки с математическими расчетами чего либо...
← →
{RASkov} © (2008-07-26 15:44) [7]Да и ось тяжеловата для твоей машинки.... имхо.
Как остальное-то ПО работает? не тормозит?
← →
ванъка (2008-07-26 15:54) [8]Специально для тестов делал новый-чистый проект, в нем одна только процедура загрузки из файла и добавления в image-листы. У меня тормозит только в одном месте — в месте добавления изображения из MemoryStream в image-лист. Без этого добавления вся операция занимает ~10 мс.
> Как остальное-то ПО работает? не тормозит?
Ну так конечно подтормаживает, но у меня открыта только сама delphi и больше никаких процессов вроде файерволлов и антивирусов. В таком случае под delphi спокойно можно работать.
← →
Riply © (2008-07-26 16:15) [9]> [0] ванъка (26.07.08 12:41)
> У меня есть собственный формат файла в котором я храню маленькие картинки
> (общий размер файла с картинками - 150 Кб), там около 60 картинок.
А ты случаем не с дискеты читаешь ? :)
P.S.
Алгоритм загрузки плохой - переделай (вынеси все из цикла, например TMemoryStream.Create, PngObj := TPNGObject.Create;).
← →
{RASkov} © (2008-07-26 16:17) [10]> [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);
← →
ванъка (2008-07-26 16:39) [11]
> А ты случаем не с дискеты читаешь ? :)
Нет, читаю с жесткого диска.
> Что за 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:52) [12]> [11] ванъка (26.07.08 16:39)
> Возможно конечно и внутри нее тормоза, но мне кажется что
> это хорошая библиотека и тормоза где-то у меня.
наивный :) Хотя точка зрения вполне в праве... и я с ней согласен. Т.е. прежде чем кого-либо винить, ищи грех у себя....
Но тут вроде как все указывает на класс TPngImageList, так как ты говоришь, что комментируешь всего лишь одну строчку с "чужим" кодом и это сказывается на скорости, то тут и нужно разбирать данную строчку.... имхо.
Смотри метод PngImages.Add и еще бы, я внимательно обратил внимание на MS. Что в нем на момент PngImage.LoadFromStream(MS);.
← →
ванъка (2008-07-26 17:12) [13]Ну вообщем видимо тупость где-то внутри этой библиотеки PNG, не ожидал честно говоря от нее такого.
Я заменил в моем коде LoadFromStream на LoadFromFile и в цикле просто загружал одну и туже картинку с жесткого диска напрямую, ну и это заняло ~4500 мс.
Вот такие вот дела. Буду искать другую библиотеку наверное.
← →
ванъка (2008-07-26 18:06) [14]Библиоткеа эта права отменная я ее так менять не хотел... И вот, в наборе был кроме TPngImageList еще один любопытный объект — TPngImageCollection (это тоже типа TPngImageList, но может хранить в себе картинки различных размеров), ну я и решил его испробовать. Попробовал добавить в него — моментально добавляется.
Стал копать в исходниках, и нашел интересное место: оказывается при добавлении картинки в TPngImageList, он автоматически делает для копию в другую отрисовку какую то и маску для нее (я не вникал в суть). Я убрал это место и о чудо, у меня все моментально грузиться и работает.
Надо только теперь проверить все ли всегда будет зорошо без убранного мною кода. Всем спасибо кто помогал!
← →
tesseract © (2008-07-26 18:24) [15]
> Библиоткеа эта права отменная я ее так менять не хотел..
> .
Zlib в ней обнови. Очень тормознутая либа, сам её недавно переписывал. Сделано грамотно, но по скорости шо ппц. И утечечки у неё неплохие. Народ не понимает, что стрbмы надо гасить по raise.
← →
ванъка (2008-07-27 13:07) [16]
> Zlib в ней обнови.
Обновил.
Еще может знаете, внутри TPngImageList, при добавлении картинки внутрь (ну например чере тот же LoadFromStream) каждый раз вызывается процедура CopyPngs, которая абсолютно глупая, она каждый раз переводит заново все картинки в иконки, не только что добавленную переводит, а вообще все в цикле, от этого у меня и стали наблюдаться тормоза.
Но у меня что-то никак не получается переделать эту процедуру (CopyPngs) для того что бы она не проходила в цикле все картинки а только обновляла добавленную картинку.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.09.07;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.005 c