Страница 1 из 2

Проблема с производительностью

Добавлено: 25 сен 2008, 11:35
Trv
Есть отчет сделанный на вебе (версия StimulReportNet20(2008_1).zip 2008.1.200.0.) В отчете 8 колонок, 200 страниц данных. Переход с одной страницы на следующую происходит 5 минуты. Выбрана опция UseCache. Компьютер CoreDue 2.13 Gz, 2 Gb памяти. При меньшем объеме данных скорость увеличивается. Таким образом пользоваться таким отчетом сейчас не возможно, единственный вариант это экспорт в Ексель.

Проблема с производительностью

Добавлено: 25 сен 2008, 17:02
Vital
Здравствуйте,

Можно использовать режим RenderOnlyCurrentPage свойства RenderMode. Этот режим специально сделан для таких случаев. Отчет строится только до страницы, которая отображается в данный момент.

Спасибо.

Проблема с производительностью

Добавлено: 26 сен 2008, 05:32
Trv
Vital писал(а):Здравствуйте,

Можно использовать режим RenderOnlyCurrentPage свойства RenderMode. Этот режим специально сделан для таких случаев. Отчет строится только до страницы, которая отображается в данный момент.

Спасибо.
В режиме RenderOnlyCurrentPage я должен перенести селект из отчета в код программы, сохранить в сессии набор данных и связывать данные с отчетом при каждом переходе на следующую страницу. Я правильно понял? К сожалению в документации не нашел примера.

Проблема с производительностью

Добавлено: 26 сен 2008, 09:59
Vital
Нет, генератор отчетов должен делать это сам. Отчет должен строиться в событии PageLoad.

Спасибо.

Проблема с производительностью

Добавлено: 26 сен 2008, 10:23
Trv
Vital писал(а):Нет, генератор отчетов должен делать это сам. Отчет должен строиться в событии PageLoad.

Спасибо.
Т.е. при переходе на слудующую страницу будут заново вытягиваться данные из базы? Или я не прав?
Сейчас при нажатии кнопки на странице у меня выполняется следующий код:

protected void BForm_Click(object sender, EventArgs e)
{
..................................................
Stimulsoft.Report.StiReport report = StiWebReport1.GetReport();
report.Load(Server.MapPath(null) + "\\Report\\Table1n.mrt");
report.Dictionary.Databases.Clear();

report.Dictionary.Databases.Add(
new Stimulsoft.Report.Dictionary.StiOleDbDatabase("Соединение", ConnectionStringData));
report.Compile();
report["param"] = value;
report["title"] ="станом за "+ title;
StiWebViewer1.Report = report;

Подскажати, как мне изменить этот код в случае использования параметра RenderOnlyCurrentPage

Проблема с производительностью

Добавлено: 26 сен 2008, 11:51
Edward
Здравствуйте.

Да, данные будут забираться из базы каждый раз.

У Вас в коде присутствует вызов метода Compile(). Компиляция отчетов (без тяжелой графики в шаблоне отчета) занимает 1 секунду или две. Соответственно, чем больше шаблон, тем дольше время компиляции. Этот момент можно оптимизировать:

Код: Выделить всё

StiReport stiReport = null;
string compiledReportFile = Server.MapPath("report.dll");
if (!File.Exists(compiledReportFile))
{
  stiReport = new StiReport();
  stiReport.Load(Server.MapPath("myreport.mrt"));
  stiReport.Dictionary.DataStore.Clear();
  stiReport.Dictionary.Databases.Clear();
  stiReport.RegData("MyDataSet", dataset);
  stiReport.Dictionary.Synchronize();
  stiReport.Compile(compiledReportFile);
}
else
{
    stiReport = StiReport.GetReportFromAssembly(compiledReportFile, true);
    stiReport.RegData("MyDataSet", dataset);
}
Сообщите также, пожалуйста, размер mrt файла и время построения Вашего отчета в Windows Forms (можно открыть отчет в Designer.exe)

5 мин все таки многовато для пострения отчета на 200 страниц.

Спасибо.

Проблема с производительностью

Добавлено: 26 сен 2008, 12:13
Trv
Edward писал(а):Здравствуйте.

Да, данные будут забираться из базы каждый раз.

У Вас в коде присутствует вызов метода Compile(). Компиляция отчетов (без тяжелой графики в шаблоне отчета) занимает 1 секунду или две. Соответственно, чем больше шаблон, тем дольше время компиляции. Этот момент можно оптимизировать:

Код: Выделить всё

StiReport stiReport = null;
string compiledReportFile = Server.MapPath("report.dll");
if (!File.Exists(compiledReportFile))
{
  stiReport = new StiReport();
  stiReport.Load(Server.MapPath("myreport.mrt"));
  stiReport.Dictionary.DataStore.Clear();
  stiReport.Dictionary.Databases.Clear();
  stiReport.RegData("MyDataSet", dataset);
  stiReport.Dictionary.Synchronize();
  stiReport.Compile(compiledReportFile);
}
else
{
    stiReport = StiReport.GetReportFromAssembly(compiledReportFile, true);
    stiReport.RegData("MyDataSet", dataset);
}
Сообщите также, пожалуйста, размер mrt файла и время построения Вашего отчета в Windows Forms (можно открыть отчет в Designer.exe)

5 мин все таки многовато для пострения отчета на 200 страниц.

Спасибо.
>Да, данные будут забираться из базы каждый раз.
Т.е. как я и писал надо переносить селект в программу и сохранять данные в сессии.

Отчет не сложный. Размер ~50 кб. В дизайнере отчет формируется ~20с. Проблема только в html при переходе с одной станицы отчета на другую. В дизайнере это нельзя смоделировать, там даже во вкладке Просмотр html показываются все страницы. Такое впечатление, что при переходе на след. страницу в отчете, он полностью заново просчитывается.

Проблема с производительностью

Добавлено: 26 сен 2008, 13:41
Vital
Здравствуйте,

Если отчет строится 20 секунд в дизайнере, то в webviewer он должен отображаться ну от силы секунд 40 (построение отчета + эскпорт отчета в html). Ну предположим еще добавляется сохранение построенного отчета в кэш. Ну секунд 20 на 200 страниц. Не должно быть большой паузы. Можно попробывать сделать так на первом шаге:

Код: Выделить всё

report.Render(false);
string str = report.SaveDocumentToString();
webViewer1.Report = report;
str сохранить в кэше.

На втором и последующем шаге отчет отображать так:

Код: Выделить всё

StiReport report = new StiReport();
report.LoadDocumentFromString(str);
webViewer1.Report = report;
Хотя собственно именно это и делается в режиме кэширования.

Спасибо.

Проблема с производительностью

Добавлено: 29 сен 2008, 06:24
Trv
Vital писал(а):Здравствуйте,

Если отчет строится 20 секунд в дизайнере, то в webviewer он должен отображаться ну от силы секунд 40 (построение отчета + эскпорт отчета в html). Ну предположим еще добавляется сохранение построенного отчета в кэш. Ну секунд 20 на 200 страниц. Не должно быть большой паузы. Можно попробывать сделать так на первом шаге:

Код: Выделить всё

report.Render(false);
string str = report.SaveDocumentToString();
webViewer1.Report = report;
str сохранить в кэше.

На втором и последующем шаге отчет отображать так:

Код: Выделить всё

StiReport report = new StiReport();
report.LoadDocumentFromString(str);
webViewer1.Report = report;
Хотя собственно именно это и делается в режиме кэширования.

Спасибо.
В режиме UseCahe переход с 1 на последнюю 220 страницу занимает 7 минут (больше чем время первого построения отчета). В режиме Standart с экспортом и импортом строки ~2 минуты. Что тоже очень много.

Проблема с производительностью

Добавлено: 04 окт 2008, 23:27
Vital
Здравствуйте,

Пришлите пожалуйста mdc файл этого отчета. Сколько времени займет сохранение построенного отчета в mdc файл?

Спасибо.