Скорость предкомпиляции?
Используем встроенный в наше ПО FR
Используем для создания форм в приложении.
До сих пор всё было нормально, но...
Столкнулись с проблемой долгой загрузки FR (предпосылки, что проверяется синтаксис или происходит предкомпиляция ...)
В коде прописано следующее (сама форма пустая):
При этом открытие просходи около 1 минуты!!!
Время между двумя ShowMessage - меньше секунды.
Подскажите - как строить подобные формы?
Используем для создания форм в приложении.
До сих пор всё было нормально, но...
Столкнулись с проблемой долгой загрузки FR (предпосылки, что проверяется синтаксис или происходит предкомпиляция ...)
В коде прописано следующее (сама форма пустая):
procedure OnStartReport(Sender: TfrxComponent);
var
str: string;
begin
FormShow('DialogPage1');
ShowMessage('Start');
str:='weoirun vq2394punvqp948nq9p38rucpw9me8rxu9qpwe8urcm9qw8uercmn9qw8urn9qw8eurn9';//Произвольная строка
//5000 (5 тыс) подобных строк
ShowMessage('Finish');
end;
При этом открытие просходи около 1 минуты!!!
Время между двумя ShowMessage - меньше секунды.
Подскажите - как строить подобные формы?
Комментарии
Согласен, тормозит.
И тормозит имеенно при открытии этого отчета. Такое подозрение, что оно его при открытии компилит каждый раз. И чем больше строк кода, тем дольше. В случае Asparagus'а 5000 строк обычного присвоения тормозит целую минуту.
Была у меня идея каким-то образом скомпилить отчет один раз, а потом его просто запускать как-то. Но пока я не догодался как.
Может кто подскажет? А то сложные большие отчеты открывать по минуте как-то неприкольно.
Если выполнение, то это нормальное явление для скрипта.
Т.к. при каждом запуске скрипт парсится и на его основе собирается XML, поэтому чем больше скрипт - тем дольше компиляция.
Предполагаю, что ускорить процесс компиляции отчетов можно изменив алгоритм работы этой функции. Избавившись от громоздких вызовов заменив их на что нибудь более быстрое.
Подумайте, может у кого нибудь получиться. Поделитесь тогда опытом
Нет, я говорю не про дизайн моду, а про запуск на выполнение.
А по поводу XML... а можно с этого места подробнее?!
Может можно изготовить этот XML один раз, а постоянно его просто подсовывать как-то?
xlaalaa, а процедура эта в исходниках компонента?
Измерял время именно запуска на выполнение (а не дизайнер). В наше программе форма отчета, при запуске на выполнение грузится из файла (из потока типа TStream) и сразу запускается на выполнение Prepare.
Процедура эта в исходниках компоненты, см. скришот. Файл исходника fs_interpreter.pas.
При загрузке полагаю основное время тратилось на функцию frxXmlToStr 4% пятая строчка на скриншоте. К стати, там если детали посмотреть тоже есть на чем с экономить например на Delete-ах из Result-а но это мелочи.
Основное конечно работа интерпретатора при построении отчета.
PS: Сейчас у меня времени нет чтобы подумать на тем как подправить алгоритм процедуры TfsScript.AddCodeLine и протестировать его. Может из читателей форума кто ни будь что то предложит. А вообще поиграть с программкой AQTime рекомендую всем программистам. Весьма интересное занятие.
Или ты храниш сразу Xml?? У меня храниться в бинарном виде.
У нас формы Xml грузятся из ресурсных файлов (это что то типа ZIP архивов)
как то так.
Я так понял, что именно тут идет обработка всего скрипта (пока не понял для чего).
Так вот оптимизация того кода мало что дает, ну может выигрыш в несколько секунд.
Можно ли весь этот процесс избежать вообще?
P.S. Поставил себе AQTime, так он сказал, что интегрится в мою делфу 2007 не будет, так как не понял версии сервиспака. Я ее переставил, он вроде установился, но в интерфейсе я его не нашел, потом он угробил делфу, пол дня промучался... мож как то можно работать с ним без интеграции?
Причем чтение не последовательное, там будут постоянные поиски и хождения по нодам (что собственно и ест большую часть времени при компиляции).
Ну и на основе текста и базового шаблона языка строится промежуточный скрипт, который тоже представляет собой XML - он и исполняется.
Сохранение промежуточного кода конечно возможно, но тут потребуется значительная доработка.
По поводу оптимизации о которой писал xlaalaa, можно сделать примерно следующие:
Т.е. избавляемся от промежуточных присвоений текста, вместо этого храним объекты списков в FUnitLines. И включаем сортировку у локального списка, что значительно снизит время поиска.
Код особо не проверял, но работать должен.
Если проблем не возникнет, то возможно включу код в текущую сборку.
Неужели большие отчеты должны так тормозно загружатся? И ничего с этим нельзя поделать?
Спасибо, сейчас попробую и отпишусь
Аж настораживает как-то. Ну будем тестить.
-=Den=-, Спасибо!
Интеграцией в дельфи не пользовался ни разу. С AQTime удобнее работать как с отдельным приложением. Приемы работы с AQTime очень хорошо описаны в документации (правда только на английском).
Вообще это мощнейший инструмент для разработчиков Delphi, C++, С#. Сего помощью проблемы производительности и утечек памяти щелкаются как семечки
-=Den=- спасибо! тоже будем тестировать, как появится время.