Tfrpages.loadfromstream выполняется очень долго

отредактировано 05:46 Раздел: FastReport 2.xx VCL
В одной сети столкнулись со следующей проблемой.
Отчет открывается очень долго на этапе загрузки печатной формы.
Выяснилось, что крайне долго выполняется метод TfrPages.LoadFromStream(Stream: TStream).
Время выполнения от 8 секунд до минуты.
Долго выполняется следующая секция:
while Stream.Position < Stream.Size do
begin
...
end;

Пока не вникал, что именно там происходит.
Может кто уже сталкивался с такой проблемой?

Когда решу вопрос, отпишусь.

Комментарии

  • отредактировано 05:46
    Решение есть и оно очевидное.

    Сначала о самой причине медленного выполнения данной секции.
    На этом этапе много раз вызывается метод Stream.Read().
    Что это значит? А значит это следующее. Если файл печатной формы передаем наследнику TfrReport непосредственно с диска, используя метод LoadFromFile(), наше клиентское приложение много раз обращается к файлу печатной формы для чтения данных. Хорошо, если печатные формы расположены локально. Хорошо, если печатные формы расположены на центральном сервере и при этом с сетью вопросов нет. Тогда с производительностью все в порядке.
    Но в случае вопросов с сетью время загрузки данных из файла печатной формы может быть непредсказуемым.

    Как выйти из этой ситуации? Очень просто. Загружаем файл печатной формы целиком в память (например, можно воспользоваться TMemoryStream) и уже затем из памяти его передаем наследнику TfrReport, используя метод LoadFromStream(). Теперь метод Stream.Read() читает данные печатной формы из локальной памяти, что обеспечивает лучшее быстродействие.
    Нам не обязательно каждый раз при вызове отчета загружать печатную форму в память. Достаточно это сделать один раз - при первом вызове отчета.
    Еще неплохо проверять время изменения файла печатной формы. Если печатная форма правилась и, соответственно, поменялось время модификации файла, то стоит заново загрузить файл в память.

    Таким образом, время выполнения Tfrpages.loadfromstream() становится минимальным.

    Мое приложение по историческим причинам работало с TfrReport.LoadFromFile(), пока не поднялся вопрос о долгом вызове отчета.

    Надеюсь, кому-нибудь эта информация поможет.

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.