С выходом новой версии FastReport.Net 2017.1.0 мы получили заметное ускорение в формировании отчета, экспорте, также сократилось потребление памяти. Эти изменения побудили меня сделать сравнительный тест «старой» и «новой» версии.
Методика тестирования
В качестве тестов будем формировать отчет и производить его экспорт в несколько форматов: PDF, XLSX, HTML с послойным методом экспорта (так как он используется в веб отчетах).
При этом измеряется время экспорта и размер полученного файла. Сначала проведем тестирование для версии 2016.4.0, затем - для новой 2017.1.0.
Берем самый популярный шаблон отчета Master-Detail. База данных XML.
Сделал вот такое нехитрое приложение:
Здесь Multi page – это обычный многостраничный отчет, а Unlimited page отчет с включенным свойством UnlimitedHeight. То есть используем два почти одинаковых отчета, но в одном будет безразмерная страница. Тут нужно отметить, что размер такого отчета ограничен 100 мегабайтами. При превышении этого рубежа будут все-таки создаваться новые страницы.
Чтобы сделать безразмерный отчет, открываем его в дизайнере. В инспекторе свойств выбираем страницу отчета и устанавливаем свойство UnlimitedHeight=true, ну или UnlimitedWidth=true, если ваш отчет растет в ширину.
Для замеров воспользуемся встроенным в FastReport профайлером:
Profiler.Start(); - для запуска.
Profiler.Stop(); - остановить и отобразить результаты замеров.
Запускаю по очереди каждый экспорт и записываю результаты профайлера. К слову результаты профайлер отображает в messagebox:
Результаты замеров
Для обычного многостраничного отчета в основном время построения сократилось. Однако не для всех, время экспорта в формат PDF немного увеличилось. Видимо не все оптимизации еще завершены.
Для того же многостраничного отчета потребление памяти тоже заметно сократилось.
А что же с «безразмерным» отчетом?
Здесь ситуация повторяется. Время построения упало для всех.
Так же и потребление памяти - сильно снизилось. Для всех, кроме PDF. Но разница минимальна.
Для тех, кому привычнее в табличном виде:
Замеры для версии 2016.4.0
|
Multi page |
Unlimited page |
||
Размер, Kb |
Время, ms |
Размер, Kb |
Время, ms |
|
Prepare |
1336 |
875 |
4040 |
875 |
|
87396 |
7031 |
81986 |
7220 |
XLSX |
23092 |
1547 |
18784 |
1734 |
HTML |
7354 |
2897 |
50576 |
1954 |
Замеры для версии 2017.1.0
|
Multi page |
Unlimited page |
||
Размер, Kb |
Время, ms |
Размер, Kb |
Время, ms |
|
Prepare |
1020 |
735 |
1088 |
703 |
|
85482 |
7167 |
82654 |
7149 |
XLSX |
16512 |
1359 |
16228 |
1640 |
HTML |
2445 |
2725 |
9180 |
1890 |
Как видите, в целом картина заметно улучшилась в новой версии. Но посмотрите, как уменьшилось потребление памяти для HTML отчета с безразмерной страницей! В отличие от 2016.4.0 потребление упало с 50576 до 9180Кб. Показатель улучшился более чем в 5 раз! А ведь это самые ходовые отчеты, для веба. Отлично поработали!
Что же изменилось внутри?
В версиях ниже 2016.4.4 использовался метод ExportPage. Он получал страницу целиком, чтобы затем пройтись по всем объектам и сохранить их в нужный формат.
Затем страница удалялась из памяти и бралась следующая.
Если итоговыми форматами были табличные, то все это еще и накапливались в промежуточной матрице.
Если ваш отчет был не очень большой, вы не замечали проблем.
Однако с появлением «безразмерных страниц» (UnlimitedHeight и UnlimitedWidth), появились и проблемы: потребление памяти.
Было принято решение перейти на бэндовую передачу данных в экспорт. Это резко сократило потребление памяти. Пришлось основательно потрудиться и «перепилить» ядро. Правда, еще не решен вопрос с матрицами, т.к. они занимают всего один бэнд, но при этом растут в размерах. Но это дело времени.
В тестах мы увидели, что потребление памяти для безразмерных страниц заметно сократилось. Но время построения в некоторых случаях немного увеличилось. Впрочем, совсем немного.
Итак, как мы убедились, работа проделана не малая и показатели заметно улучшились. Особенно это заметно для HTML экспорта, что крайне ценно для веб-отчетов.