Общие рекомендации по повышению быстродействия формирования отчетов

Обсуждение Stimulsoft Reports.NET
Ответить
t0lik
Сообщения: 75
Зарегистрирован: 24 окт 2008, 12:35
Откуда: SPb

Общие рекомендации по повышению быстродействия формирования отчетов

Сообщение t0lik »

Сабж. Есть ли таковые? Пользователей не очень устраивает скорость формирования при пакетной печати документов. Интересует сокращение времени рендеринга и печати как такового, компиляция однотипных отчетов делается и так один раз.
Jan
Сообщения: 495
Зарегистрирован: 19 фев 2009, 11:14

Общие рекомендации по повышению быстродействия формирования отчетов

Сообщение Jan »

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

Покажите пожалуйста код, который используется для построения и печати отчетов. Так же интересует, что именно является узким местом - формирование отчета или его печать?

Спасибо.
t0lik
Сообщения: 75
Зарегистрирован: 24 окт 2008, 12:35
Откуда: SPb

Общие рекомендации по повышению быстродействия формирования отчетов

Сообщение 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 секунд.
Для примера распределение времени во втором случае (в первом аналогично пропорционально):

Изображение
Jan
Сообщения: 495
Зарегистрирован: 19 фев 2009, 11:14

Общие рекомендации по повышению быстродействия формирования отчетов

Сообщение Jan »

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

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

PrinterSettings settings = new PrinterSettings();

может отнимать по 5-10 секунд времени. Особенно это актуально для сетевых принтеров. Попробуйте отключить (для эксперимента) все операции с размерами бумаг, настройками принтеров и т.д. Также возможны очень большие задержки из-за размеров бумаги (настройки страницы в внутри отчета), которые не совсем "попадают" в размеры поддерживаемые принтером. Стоит также попробывать установить свойство PaperSize в конкретный размер (по умолчанию задан Custom).

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