Тюнінг продуктивності
Оптимізуйте рендеринг та пам'ять
Профіль ресурсів Doconut домінує три речі: render DPI, what stays cached, і how long sessions live. Цей посібник проходить по важелях у порядку їх впливу.
Роздільна здатність — найбільший важіль
ImageResolution (25–300 DPI) визначає як час рендерингу, так і розмір зображення. Більшість форматів за замовчуванням мають 200 DPI; зображення та PSD — 100.
// A document list preview doesn't need print quality
var token = await viewer.OpenDocumentAsync(path, new PdfConfig { ImageResolution = 100 });Зменшення DPI вдвічі приблизно зменшує кількість пікселів на сторінці в чотири рази — швидший рендер, менші передачі, менше пам'яті кешу. Виділіть 250–300 DPI для випадків, коли часто використовується масштабування (CAD, інженерні креслення).
Для PDF‑файлів з великим вбудованим зображенням PdfConfig додає більш точні налаштування: CompressImages + CompressQuality, ResizeImages + ResizeResolution і CompressFast. Для простих зображень ImageConfig.MaxImagePixelSize (за замовчуванням 3000 px) обмежує розмір вихідного файлу.
Кешування сторінок — пам'ять vs. повторний рендер
BaseConfig.CachePages (за замовчуванням true) зберігає кожну відрендерену сторінку в пам'яті протягом усього часу життя сесії. Це правильне значення за замовчуванням для інтерактивного перегляду — користувачі прокручують вперед і назад. Вимикайте його, коли:
- документи величезні і переглядаються один раз, від початку до кінця,
- багато одночасних сесій множать кешовані сторінки,
- ви радше платите за CPU за перегляд, ніж тримаєте RAM.
var token = await viewer.OpenDocumentAsync(path, new PdfConfig { CachePages = false });На клієнті ViewerConfig.CacheEnabled = true передзавантажує невелике рухоме вікно майбутніх зображень сторінок у пам'ять браузера. Це кеш попереднього завантаження на один перегляд, а не постійний localStorage.
Сесії — пам'ять, яку ви не бачите
Кожна відкрита сесія тримає розпарсений модель документа плюс (з CachePages) його відрендерені сторінки, доки не сплине скользяний TimeOut (за замовчуванням 60 хв) з моменту останнього запиту. Дві звички допомагають тримати це під контролем:
- Закривайте те, чим закінчили користуватися.
viewer.CloseDocument(token)звільняє движок одразу, замість очікування простоя. - Підбирайте правильний тайм‑аут. Попередній перегляд, який користувачі переглядають дві хвилини, не потребує годинної сесії:
var token = await viewer.OpenDocumentAsync(path, new DocOptions { TimeOut = 10 });Пам'ятайте про компроміс: після закінчення тайм‑ауту віджет показує Document session not found. Please re-open document. — оберіть тайм‑аут, що відповідає реальним сеансам читання.
Формат-специфічні перемикачі
- Excel:
MemoryOptimizationPreferenceувімкнено за замовчуванням і зменшує використання пам'яті при рендерингу дуже великих робочих книг — залишайте його увімкненим, або встановітьfalse, якщо готові пожертвувати пам'яттю заради невеликого приросту швидкості;SheetNames/PrintAreaобмежують рендеринг лише потрібними ділянками. - Redirect mode має початкові витрати:
DefaultRender = falseконвертує весь документ у PDF під час відкриття. Це дає можливість нативного текстового пошуку, але для 500‑сторінкового документа виклик відкриття включає цю конверсію — не вмикайте його автоматично. - Word/PPT на Linux/Docker: відсутність шрифтів викликає повільне резервне пошук та неправильні метрики; вкажіть
FontFoldersна каталог з вашими шрифтами. - Презентації на Linux/macOS: файли PPT/PPTX/PPS/POT/ODP можна відкривати, але рендеринг поточної презентаційної системи вимагає нативного
libgdiplusта перемикача середовищаSystem.Drawing.EnableUnixSupport=true. Інші сімейства форматів користуються звичайним крос‑платформеним шляхом рендерингу.
Стратегії на стороні клієнта
LargeDoc = true— стратегія лінивої загрузки для дуже великих документів; сторінки завантажуються, коли користувач наближається до них.AutoLoad = false(за замовчуванням) — не рендерити, доки ви явно не викликаєтеView(token).ShowThumbs = false— пропускати генерацію/запити мініатюр для односторінкових або вбудованих попередніх переглядів.- Увімкнення
FixedZoomзапобігає довільним змінам масштабу; коли ви налаштовуєте C#ViewerConfig, підберітьFixedZoomPercentMobile(за замовчуванням C# 75) для малих екранів.
Запуск один раз, а не на кожен запит
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance) має бути в Program.cs — реєстрація кодувань на кожен запит є марнотратною; повне пропускання цього кроку ламає документи зі старими кодовими сторінками.
Розподіл роботи між вузлами
Все вище налаштовує рендеринг на одному вузлі за запитом. Коли один вузол не може впоратися з навантаженням, наступний важіль — не більший діал, а публікація артефактів документа один раз у спільне сховище та дозволення кожному вузлу їх обслуговувати. Це змінює модель витрат: рендеринг відбувається один раз на документ замість одного разу на сесію, а запити сторінок стають читанням файлів. Дивіться Розподілені розгортання.
Чекліст налаштувань
- Встановіть найнижчу
ImageResolution, яку приймає ваш UX. - Тримайте
CachePagesувімкненим для інтерактивного перегляду; вимкніть для одноразових або сценаріїв з високою конкуренцією. - Явно закривайте сесії; скорочуйте
TimeOut, коли використання спорадичне. - Використовуйте
LargeDoc+ за замовчуваннямAutoLoad = falseна клієнті для великих документів. - Використовуйте
DefaultRender = falseлише коли потрібна PDF‑проекція з текстом.
Чи була ця сторінка корисною?