Ряд вопросов.
Ряд вопросов.
Здравствуйте.
Знакомлюсь с демоверсией. Пока очень нравится
Но с одним только FAQ сложновато на певых порах...
Итак.
1. Нам необходим(на данном этапе) только дизайнер. Далее, сформированный отчёт мы экспортим в необходимый нам формат. Какова должна быть последовательность действий в нашем случае? Естественно, прежде всего волнует производительность : нужна максимальная скорость.
stiReport1.Load(...);
stiReport1.RegData(dsWork);
stiReport1.Render(false);
stiReport1.Export(...);
Эту песню сократить никак нельзя?
2. Для теста создал отчёт, в рантайме пытаюсь использовать его с разными источниками данных.
Делаю так :
dsWork = LoadBillsSimple(х);
stiReport1.RegData(dsWork);
stiReport1.Render(false);
в dsWork у меня всегда одна таблица, но с разным содержимым.
и, похоже, данные синхронизируются, т.е., всё что было в источнике данных отчёта при предыдущем запуске - остаётся. Это только предположение : сужу по кол-ву данных.
Что я делаю не так?
Спасибо.
Знакомлюсь с демоверсией. Пока очень нравится
Но с одним только FAQ сложновато на певых порах...
Итак.
1. Нам необходим(на данном этапе) только дизайнер. Далее, сформированный отчёт мы экспортим в необходимый нам формат. Какова должна быть последовательность действий в нашем случае? Естественно, прежде всего волнует производительность : нужна максимальная скорость.
stiReport1.Load(...);
stiReport1.RegData(dsWork);
stiReport1.Render(false);
stiReport1.Export(...);
Эту песню сократить никак нельзя?
2. Для теста создал отчёт, в рантайме пытаюсь использовать его с разными источниками данных.
Делаю так :
dsWork = LoadBillsSimple(х);
stiReport1.RegData(dsWork);
stiReport1.Render(false);
в dsWork у меня всегда одна таблица, но с разным содержимым.
и, похоже, данные синхронизируются, т.е., всё что было в источнике данных отчёта при предыдущем запуске - остаётся. Это только предположение : сужу по кол-ву данных.
Что я делаю не так?
Спасибо.
Ряд вопросов.
Да с документацией пок сложновато у нас. Новые возможности появляются слишком быстро.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();
Ряд вопросов.
Спасибо за ответ. Но пока ещё не всё ясно
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-х словах про процедуру рендеринга?
Спасибо.
1. Source code of the report is formed. Forming based on the grounds of meta description of the reportVital писал(а): Лучшая оптимизация - это предварительная компиляция отчета или компиляция отчета на первом запуске.
Это дает увеличение производительности в разы. Почитать об этом можно здесь:
How to speed up report creation and design
Need more Ram for my Reports ?
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-х словах про процедуру рендеринга?
Спасибо.
Ряд вопросов.
Отчет, который лежит на форме к сожалению не компилится в Вашу сборку. Потому компиляция в сборку поможет.
Попробуйте следующий код:
Если необходима компиляция, то она вызывается.
Спасибо.
Попробуйте следующий код:
Код: Выделить всё
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(...
}
А что Вы хотите знать про этот метод? В кратце эта процедура строит отчет. Готовые страницы складываются в свойство report.RenderedPages.И ещё... Можно в 2-х словах про процедуру рендеринга?
Если необходима компиляция, то она вызывается.
Спасибо.
Ряд вопросов.
И ещё.
stiReport1.ExportDocument(Stimulsoft.Report.StiExportFormat.Pdf, "C:\\report.pdf");
Как-то странно себя ведёт. После первой загрузки данных - экспорт корректный. А после повторной загрузки(других данных) экспортит старые либо вообще пустой Pdf создаёт. Хотя, если вызаваю report.design и preview - данные вижу.
Спасибо.
stiReport1.ExportDocument(Stimulsoft.Report.StiExportFormat.Pdf, "C:\\report.pdf");
Как-то странно себя ведёт. После первой загрузки данных - экспорт корректный. А после повторной загрузки(других данных) экспортит старые либо вообще пустой Pdf создаёт. Хотя, если вызаваю report.design и preview - данные вижу.
Спасибо.
Ряд вопросов.
Сорри, что отнимаю время, но у меня задача : оценить производительность системы...
Такой вот простенький обработчик :
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
сек
что я делаю не так?
Спасибо.
Такой вот простенький обработчик :
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
сек
что я делаю не так?
Спасибо.
Ряд вопросов.
Код верный. У Вас судя по всему получается в районе 100 страниц в отчете. Если машина мощная, то
разницы на этом количестве страниц Вы не заметите. Компиляция в среднем занимает от 0,2 до 3 сек (p4-3000).
Зависит от многих параметров. При объеме отчета в 10 страниц это становится заметно. Кроме того .Net
часто оптимизирует загрузку компилятора (он грузится как процесс), но не всегда.
Время измерений может меняться незначительно.
p.s. Если Вы тестируете в VS2005, то стоит запускать в Runtime режиме.
Спасибо.
разницы на этом количестве страниц Вы не заметите. Компиляция в среднем занимает от 0,2 до 3 сек (p4-3000).
Зависит от многих параметров. При объеме отчета в 10 страниц это становится заметно. Кроме того .Net
часто оптимизирует загрузку компилятора (он грузится как процесс), но не всегда.
Время измерений может меняться незначительно.
p.s. Если Вы тестируете в VS2005, то стоит запускать в Runtime режиме.
Спасибо.
Ряд вопросов.
1. У меня 500 страницVital писал(а):Код верный. У Вас судя по всему получается в районе 100 страниц в отчете. Если машина мощная, то
разницы на этом количестве страниц Вы не заметите. Компиляция в среднем занимает от 0,2 до 3 сек (p4-3000).
Зависит от многих параметров. При объеме отчета в 10 страниц это становится заметно. Кроме того .Net
часто оптимизирует загрузку компилятора (он грузится как процесс), но не всегда.
Время измерений может меняться незначительно.
p.s. Если Вы тестируете в VS2005, то стоит запускать в Runtime режиме.
Спасибо.
машина слабенькая
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 ?
Ещё раз сорри за надоедливость.
Ещё пару моментов выясню и пойду убеждать руководство в необходимости приобретения вашего продуута
Спасибо.
Ряд вопросов.
Память занимается загруженной сборкой отчета. Выгрузить ее нельзя (можно вместе с доменом приложения).TVV писал(а):1. У меня 500 страницVital писал(а):Код верный. У Вас судя по всему получается в районе 100 страниц в отчете. Если машина мощная, то
разницы на этом количестве страниц Вы не заметите. Компиляция в среднем занимает от 0,2 до 3 сек (p4-3000).
Зависит от многих параметров. При объеме отчета в 10 страниц это становится заметно. Кроме того .Net
часто оптимизирует загрузку компилятора (он грузится как процесс), но не всегда.
Время измерений может меняться незначительно.
p.s. Если Вы тестируете в VS2005, то стоит запускать в Runtime режиме.
Спасибо.
машина слабенькая
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); В этом случае гарантируется однократная загрузка сборки
отчета в память.
Извините, пропустили этот вопрос. Проверьте пожалуйста, если использовать вместо PDF скажем RTF будет ли повторяться проблема?2. Так что там с экспортом в PDF ?
Спасибо.
Ряд вопросов.
Я не очень понимаю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();
ничего не меняю, закрываю окно дизайнера.
экспорт ни в один формат уже не работает, видимо очистились результаты рендеринга.
может это и правильно, но не очень очевидно.
Спасибо.