Ряд вопросов.

Обсуждение Stimulsoft Reports.NET
TVV
Сообщения: 27
Зарегистрирован: 08 сен 2006, 15:07

Ряд вопросов.

Сообщение TVV »

Здравствуйте.

Знакомлюсь с демоверсией. Пока очень нравится :)

Но с одним только FAQ сложновато на певых порах... :(

Итак.

1. Нам необходим(на данном этапе) только дизайнер. Далее, сформированный отчёт мы экспортим в необходимый нам формат. Какова должна быть последовательность действий в нашем случае? Естественно, прежде всего волнует производительность : нужна максимальная скорость.

stiReport1.Load(...);
stiReport1.RegData(dsWork);
stiReport1.Render(false);
stiReport1.Export(...);

Эту песню сократить никак нельзя?

2. Для теста создал отчёт, в рантайме пытаюсь использовать его с разными источниками данных.
Делаю так :

dsWork = LoadBillsSimple(х);
stiReport1.RegData(dsWork);
stiReport1.Render(false);

в dsWork у меня всегда одна таблица, но с разным содержимым.
и, похоже, данные синхронизируются, т.е., всё что было в источнике данных отчёта при предыдущем запуске - остаётся. Это только предположение : сужу по кол-ву данных.
Что я делаю не так?

Спасибо.
Vital
Сообщения: 647
Зарегистрирован: 09 июн 2006, 12:23

Ряд вопросов.

Сообщение Vital »

TVV писал(а):Здравствуйте.

Знакомлюсь с демоверсией. Пока очень нравится :)

Но с одним только FAQ сложновато на певых порах... :(
Да с документацией пок сложновато у нас. Новые возможности появляются слишком быстро.
В следующей версии документация будет более полная.
Итак.

1. Нам необходим(на данном этапе) только дизайнер. Далее, сформированный отчёт мы экспортим в необходимый нам формат. Какова должна быть последовательность действий в нашем случае? Естественно, прежде всего волнует производительность : нужна максимальная скорость.

stiReport1.Load(...);
stiReport1.RegData(dsWork);
stiReport1.Render(false);
stiReport1.Export(...);

Эту песню сократить никак нельзя?
Лучшая оптимизация - это предварительная компиляция отчета или компиляция отчета на первом запуске.
Это дает увеличение производительности в разы. Почитать об этом можно здесь:

How to speed up report creation and design
Need more Ram for my Reports ?

2. Для теста создал отчёт, в рантайме пытаюсь использовать его с разными источниками данных.
Делаю так :

dsWork = LoadBillsSimple(х);
stiReport1.RegData(dsWork);
stiReport1.Render(false);

в dsWork у меня всегда одна таблица, но с разным содержимым.
и, похоже, данные синхронизируются, т.е., всё что было в источнике данных отчёта при предыдущем запуске - остаётся. Это только предположение : сужу по кол-ву данных.
Что я делаю не так?

Спасибо.
Очистите хранилище данных от старых данных:

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

report.Dictionary.DataStore.Clear();
Спасибо.
TVV
Сообщения: 27
Зарегистрирован: 08 сен 2006, 15:07

Ряд вопросов.

Сообщение TVV »

Спасибо за ответ. Но пока ещё не всё ясно :(
Vital писал(а): Лучшая оптимизация - это предварительная компиляция отчета или компиляция отчета на первом запуске.
Это дает увеличение производительности в разы. Почитать об этом можно здесь:

How to speed up report creation and design
Need more Ram for my Reports ?
1. Source code of the report is formed. Forming based on the grounds of meta description of the report
2. This source code is compiled in to assembly
3. Assembly is loaded in to memory
4. Create object of the report from loaded assemblies
...

Для тестов я использую компонент StiReport. Дизайн произвожу прямо на форме(в дизайн-тайм, естественно).
stiReport1.Load не вызываю.
Делаю только

stiReport1.Dictionary.DataStore.Clear();
stiReport1.RegData(dsWork);
stiReport1.Render(false);
stiReport1.ExportDocument(...

Для разных dsWork.

Я так понимаю, ксмпиляция происходит 1 раз, прямо в мою сборку, правильно?
Соответственно, ускорения указанным методом(предварительная компиляция отчета или компиляция отчета на первом запуске) я не добьюсь, верно?

И ещё... Можно в 2-х словах про процедуру рендеринга?

Спасибо.
Vital
Сообщения: 647
Зарегистрирован: 09 июн 2006, 12:23

Ряд вопросов.

Сообщение Vital »

Отчет, который лежит на форме к сожалению не компилится в Вашу сборку. Потому компиляция в сборку поможет.
Попробуйте следующий код:

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

if (File.Exist("Report.dll")
{
     stiReport1 = StiReport.GetReportFromAssembly("Report.dll", true);
}
else 
{
    stiReport1.Compile("Report.dll");
    stiReport1 = stiReport.CompiledReport;
}

//Перебираем таблицы 
{
    stiReport1.Dictionary.DataStore.Clear();
    stiReport1.RegData(dsWork);
    stiReport1.Render(false);
    stiReport1.ExportDocument(...
}
И ещё... Можно в 2-х словах про процедуру рендеринга?
А что Вы хотите знать про этот метод? В кратце эта процедура строит отчет. Готовые страницы складываются в свойство report.RenderedPages.
Если необходима компиляция, то она вызывается.

Спасибо.


TVV
Сообщения: 27
Зарегистрирован: 08 сен 2006, 15:07

Ряд вопросов.

Сообщение TVV »

И ещё.

stiReport1.ExportDocument(Stimulsoft.Report.StiExportFormat.Pdf, "C:\\report.pdf");

Как-то странно себя ведёт. После первой загрузки данных - экспорт корректный. А после повторной загрузки(других данных) экспортит старые либо вообще пустой Pdf создаёт. Хотя, если вызаваю report.design и preview - данные вижу.

Спасибо.
TVV
Сообщения: 27
Зарегистрирован: 08 сен 2006, 15:07

Ряд вопросов.

Сообщение TVV »

Сорри, что отнимаю время, но у меня задача : оценить производительность системы...

Такой вот простенький обработчик :

private void btnLoadData_Click(object sender, System.EventArgs e)
{
DateTime dtStart = DateTime.Now;

AddToLog("Data loading of " + udBillCount.Value + " records started at " + dtStart);

DataSet dsWork = new DataSet();
try
{
dsWork = LoadBillsSimple((int)udBillCount.Value);
}
catch (Exception exc)

{
AddToLog(exc.Message);
}

DateTime dtStop = DateTime.Now;

AddToLog(
"Data loading of " + udBillCount.Value + " records finisheded at " +
dtStop + " (" + (dtStop - dtStart) + ")" + "\r\n");


dtStart = DateTime.Now;

AddToLog("Preparing report with " + udBillCount.Value + " records started at " + dtStart);

try
{
if (File.Exists("Report.dll"))
{
stiReport1 = StiReport.GetReportFromAssembly("Report.dll", true);
}
else
{
stiReport1.Compile("Report.dll");
stiReport1 = stiReport1.CompiledReport;
}

stiReport1.Dictionary.DataStore.Clear();
stiReport1.RegData(dsWork);
stiReport1.Render(false);
}
catch (Exception exc)

{
AddToLog(exc.Message);
}

dtStop = DateTime.Now;

AddToLog(
"Preparing report with " + udBillCount.Value + " records finisheded at " +
dtStop + " (" + (dtStop - dtStart) + ")" + "\r\n");

}


Вот лог, который выдаёт данный метод( 3 последовательных вызова ) :
---------------------------
Data loading of 5000 records started at 11.09.2006 9:57:01
Data loading of 5000 records finisheded at 11.09.2006 9:57:04 (00:00:02.2157538)

Preparing report with 5000 records started at 11.09.2006 9:57:04
Preparing report with 5000 records finisheded at 11.09.2006 9:57:12 (00:00:08.3168787)
----
Data loading of 5000 records started at 11.09.2006 9:57:17
Data loading of 5000 records finisheded at 11.09.2006 9:57:18 (00:00:00.7801950)

Preparing report with 5000 records started at 11.09.2006 9:57:18
Preparing report with 5000 records finisheded at 11.09.2006 9:57:27 (00:00:08.5665411)
----
Data loading of 5000 records started at 11.09.2006 9:57:36
Data loading of 5000 records finisheded at 11.09.2006 9:57:37 (00:00:00.8270067)

Preparing report with 5000 records started at 11.09.2006 9:57:37
Preparing report with 5000 records finisheded at 11.09.2006 9:57:45 (00:00:08.6445606)
---------------------------

т.е., код

if (File.Exists("Report.dll"))
{
stiReport1 = StiReport.GetReportFromAssembly("Report.dll", true);
}
else
{
stiReport1.Compile("Report.dll");
stiReport1 = stiReport1.CompiledReport;
}

stiReport1.Dictionary.DataStore.Clear();
stiReport1.RegData(dsWork);
stiReport1.Render(false);

выполняется, соответственно

08.3
08.56
08.6

сек

что я делаю не так?

Спасибо.
Vital
Сообщения: 647
Зарегистрирован: 09 июн 2006, 12:23

Ряд вопросов.

Сообщение Vital »

Код верный. У Вас судя по всему получается в районе 100 страниц в отчете. Если машина мощная, то
разницы на этом количестве страниц Вы не заметите. Компиляция в среднем занимает от 0,2 до 3 сек (p4-3000).
Зависит от многих параметров. При объеме отчета в 10 страниц это становится заметно. Кроме того .Net
часто оптимизирует загрузку компилятора (он грузится как процесс), но не всегда.

Время измерений может меняться незначительно.

p.s. Если Вы тестируете в VS2005, то стоит запускать в Runtime режиме.

Спасибо.
TVV
Сообщения: 27
Зарегистрирован: 08 сен 2006, 15:07

Ряд вопросов.

Сообщение TVV »

Vital писал(а):Код верный. У Вас судя по всему получается в районе 100 страниц в отчете. Если машина мощная, то
разницы на этом количестве страниц Вы не заметите. Компиляция в среднем занимает от 0,2 до 3 сек (p4-3000).
Зависит от многих параметров. При объеме отчета в 10 страниц это становится заметно. Кроме того .Net
часто оптимизирует загрузку компилятора (он грузится как процесс), но не всегда.

Время измерений может меняться незначительно.

p.s. Если Вы тестируете в VS2005, то стоит запускать в Runtime режиме.

Спасибо.
1. У меня 500 страниц :)
машина слабенькая
8 сек...
с этим можно смириться

Пробую 5000 страниц
отжирает 325 метров оперативки + 407 метров виртуальной
но и это не смертельно(пример не слишком жизненный + .Net)
но!

снова делаю :

if (File.Exists("Report.dll"))
{
stiReport1 = StiReport.GetReportFromAssembly("Report.dll", true);
}
else
{
stiReport1.Compile("Report.dll");
stiReport1 = stiReport1.CompiledReport;
}

stiReport1.Dictionary.DataStore.Clear();
stiReport1.RegData(dsWork);
stiReport1.Render(false);

... для датасета всего с 10 записями!
И память не отдаёт...
А вот это уже не хорошо...
Что-то ещё нужно чистить?

2. Так что там с экспортом в PDF ?

Ещё раз сорри за надоедливость.
Ещё пару моментов выясню и пойду убеждать руководство в необходимости приобретения вашего продуута :)

Спасибо.
Vital
Сообщения: 647
Зарегистрирован: 09 июн 2006, 12:23

Ряд вопросов.

Сообщение Vital »

TVV писал(а):
Vital писал(а):Код верный. У Вас судя по всему получается в районе 100 страниц в отчете. Если машина мощная, то
разницы на этом количестве страниц Вы не заметите. Компиляция в среднем занимает от 0,2 до 3 сек (p4-3000).
Зависит от многих параметров. При объеме отчета в 10 страниц это становится заметно. Кроме того .Net
часто оптимизирует загрузку компилятора (он грузится как процесс), но не всегда.

Время измерений может меняться незначительно.

p.s. Если Вы тестируете в VS2005, то стоит запускать в Runtime режиме.

Спасибо.
1. У меня 500 страниц :)
машина слабенькая
8 сек...
с этим можно смириться

Пробую 5000 страниц
отжирает 325 метров оперативки + 407 метров виртуальной
но и это не смертельно(пример не слишком жизненный + .Net)
но!

снова делаю :

if (File.Exists("Report.dll"))
{
stiReport1 = StiReport.GetReportFromAssembly("Report.dll", true);
}
else
{
stiReport1.Compile("Report.dll");
stiReport1 = stiReport1.CompiledReport;
}

stiReport1.Dictionary.DataStore.Clear();
stiReport1.RegData(dsWork);
stiReport1.Render(false);

... для датасета всего с 10 записями!
И память не отдаёт...
А вот это уже не хорошо...
Что-то ещё нужно чистить?
Память занимается загруженной сборкой отчета. Выгрузить ее нельзя (можно вместе с доменом приложения).
Поэтому и нужно компилировать отчет на диск и потом грузить ее при помощи
StiReport.GetReportFromAssembly("Report.dll", true); В этом случае гарантируется однократная загрузка сборки
отчета в память.
2. Так что там с экспортом в PDF ?
Извините, пропустили этот вопрос. Проверьте пожалуйста, если использовать вместо PDF скажем RTF будет ли повторяться проблема?

Спасибо.
TVV
Сообщения: 27
Зарегистрирован: 08 сен 2006, 15:07

Ряд вопросов.

Сообщение TVV »

Vital писал(а): Память занимается загруженной сборкой отчета. Выгрузить ее нельзя (можно вместе с доменом приложения).
Поэтому и нужно компилировать отчет на диск и потом грузить ее при помощи
StiReport.GetReportFromAssembly("Report.dll", true); В этом случае гарантируется однократная загрузка сборки
отчета в память.
Я не очень понимаю :(

- Запустил приложение. - "Съедено" 50 мб.

// !!! 100 записей = 10 страниц

- stiReport1 = StiReport.GetReportFromAssembly("Report.dll", true); - "Съедено" 80 мб.

- stiReport1.Dictionary.DataStore.Clear();
- stiReport1.RegData(dsWork);
- stiReport1.Render(false); - "Съедено" 81 мб.

// !!! 10000 записей = 1000 страниц
- stiReport1 = StiReport.GetReportFromAssembly("Report.dll", true); - "Съедено" 90 мб.

- stiReport1.Dictionary.DataStore.Clear(); - "Съедено" 90 мб.
- stiReport1.RegData(dsWork); - "Съедено" 90 мб.
- stiReport1.Render(false); - "Съедено" 280 мб.

Память отжирает (что логично) именно рендеринг, те самые "RenderedPages" и что-нибудь ещё по ходу...

А когда я третий раз запускаю обработчик

// !!! 100 записей = 10 страниц

- stiReport1 = StiReport.GetReportFromAssembly("Report.dll", true); - "Съедено" 280 мб.

- stiReport1.Dictionary.DataStore.Clear();
- stiReport1.RegData(dsWork);
- stiReport1.Render(false); - "Съедено" 280 мб.

Мне кажется, что память съедается в процecce рендеринга. Нет?
Но проблема в том, что не отдаёт её при, например, очередном вызове GetReportFromAssembly или Render...
Vital писал(а): 2. Так что там с экспортом в PDF ?

Извините, пропустили этот вопрос. Проверьте пожалуйста, если использовать вместо PDF скажем RTF будет ли повторяться проблема?
Понял проблему(а может и не проблему :)

вызываю stiReport1.Design();

ничего не меняю, закрываю окно дизайнера.

экспорт ни в один формат уже не работает, видимо очистились результаты рендеринга.
может это и правильно, но не очень очевидно.

Спасибо.
Ответить