Страница 1 из 1
Общие рекомендации по повышению быстродействия формирования отчетов
Добавлено: 15 мар 2010, 06:17
t0lik
Сабж. Есть ли таковые? Пользователей не очень устраивает скорость формирования при пакетной печати документов. Интересует сокращение времени рендеринга и печати как такового, компиляция однотипных отчетов делается и так один раз.
Общие рекомендации по повышению быстродействия формирования отчетов
Добавлено: 16 мар 2010, 06:31
Jan
Здравствуйте,
Покажите пожалуйста код, который используется для построения и печати отчетов. Так же интересует, что именно является узким местом - формирование отчета или его печать?
Спасибо.
Общие рекомендации по повышению быстродействия формирования отчетов
Добавлено: 16 мар 2010, 09:15
t0lik
Код такой:
Код: Выделить всё
var tempFile = new FileInfo(Path.GetTempFileName());
tempFile.Delete();
PrinterSettings printSettings;
var oldPaperSize = StiPrintProvider.PaperSizeForUsing;
StiOptions.Print.UsePrinterSettingsEntirely = true;
StiPrintProvider.SetPaperSource = false;
printSettings = new PrinterSettings();
if (PrinterSettings.InstalledPrinters.Count == 0)
{
MessageBox.Show("В системе не установлено ни одного принтера!", "Ошибка пакетной печати");
return;
}
if(printSettings.PaperSources.Count>0)
{
printSettings.DefaultPageSettings.PaperSource = printSettings.PaperSources[0];
StiPrintProvider.SetPaperSource = true;
}
StiPrintProvider.PaperSizeForUsing = printSettings.DefaultPageSettings.PaperSize;
if (printData[0].printerSettings != null)
{
printSettings.Collate = printData[0].printerSettings.Collate;
printSettings.Copies = printData[0].printerSettings.Copies;
printSettings.PrinterName = printData[0].printerSettings.PrinterName;
}
foreach (PrintData data in printData)
{
StiReport subReport;
if (File.Exists(tempFile.FullName))
subReport = StiReport.GetReportFromAssembly(tempFile.FullName, true);
else
{
subReport = new StiReport();
subReport.ReportUnit = StiReportUnitType.Millimeters;
subReport.Load(data.fileName);
subReport.Compile(tempFile.FullName);
}
if (String.IsNullOrEmpty(printerSettings.PrinterName))
CopyPrinterSettings(subReport.PrinterSettings, printerSettings);
else
CopyPrinterSettings(printerSettings, subReport.PrinterSettings);
subReport.PrinterSettings.ShowDialog = false;
if (!String.IsNullOrEmpty(data.Title))
{
if (subReport.CompiledReport != null)
subReport.CompiledReport.ReportName = data.Title;
else
subReport.ReportName = data.Title;
}
subReport.RegData(data.DataSetName, data.DataSetName, data.data);
subReport.Render(false);
subReport.Print(printSettings);
}
StiPrintProvider.PaperSizeForUsing = oldPaperSize;
StiPrintProvider.SetPaperSource = true;
StiOptions.Print.UsePrinterSettingsEntirely = false;
Печать 20 документов (акты на 1-2 страницы) занимает на целероне 2.6ГГц с 1ГБ памяти 36 секунд, на Core 2 Duo 2.8 с 4ГБ памяти - 19 секунд.
Для примера распределение времени во втором случае (в первом аналогично пропорционально):
Общие рекомендации по повышению быстродействия формирования отчетов
Добавлено: 16 мар 2010, 15:02
Jan
Здравствуйте,
Насколько я вижу из графиков печать занимает гораздо больше времени, чем построение отчета. Процедура печати у нас довольна проста. Состоит из перебора уже построенных страниц и последовательной отрисовке этих страниц на канве принтера. На скорость очень сильно может влиять принтер (и его драйвера), на котором производится печать. К примеру, на некоторых моделей принтеров вот такой код:
PrinterSettings settings = new PrinterSettings();
может отнимать по 5-10 секунд времени. Особенно это актуально для сетевых принтеров. Попробуйте отключить (для эксперимента) все операции с размерами бумаг, настройками принтеров и т.д. Также возможны очень большие задержки из-за размеров бумаги (настройки страницы в внутри отчета), которые не совсем "попадают" в размеры поддерживаемые принтером. Стоит также попробывать установить свойство PaperSize в конкретный размер (по умолчанию задан Custom).
Спасибо.