Тюнінг продуктивності

Оптимізуйте рендеринг та пам'ять

Профіль ресурсів Doconut домінує три речі: render DPI, what stays cached, і how long sessions live. Цей посібник проходить по важелях у порядку їх впливу.

Роздільна здатність — найбільший важіль

ImageResolution (25–300 DPI) визначає як час рендерингу, так і розмір зображення. Більшість форматів за замовчуванням мають 200 DPI; зображення та PSD — 100.

csharp
// 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.
csharp
var token = await viewer.OpenDocumentAsync(path, new PdfConfig { CachePages = false });

На клієнті ViewerConfig.CacheEnabled = true передзавантажує невелике рухоме вікно майбутніх зображень сторінок у пам'ять браузера. Це кеш попереднього завантаження на один перегляд, а не постійний localStorage.

Сесії — пам'ять, яку ви не бачите

Кожна відкрита сесія тримає розпарсений модель документа плюс (з CachePages) його відрендерені сторінки, доки не сплине скользяний TimeOut (за замовчуванням 60 хв) з моменту останнього запиту. Дві звички допомагають тримати це під контролем:

  • Закривайте те, чим закінчили користуватися. viewer.CloseDocument(token) звільняє движок одразу, замість очікування простоя.
  • Підбирайте правильний тайм‑аут. Попередній перегляд, який користувачі переглядають дві хвилини, не потребує годинної сесії:
csharp
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 — реєстрація кодувань на кожен запит є марнотратною; повне пропускання цього кроку ламає документи зі старими кодовими сторінками.

Розподіл роботи між вузлами

Все вище налаштовує рендеринг на одному вузлі за запитом. Коли один вузол не може впоратися з навантаженням, наступний важіль — не більший діал, а публікація артефактів документа один раз у спільне сховище та дозволення кожному вузлу їх обслуговувати. Це змінює модель витрат: рендеринг відбувається один раз на документ замість одного разу на сесію, а запити сторінок стають читанням файлів. Дивіться Розподілені розгортання.

Чекліст налаштувань

  1. Встановіть найнижчу ImageResolution, яку приймає ваш UX.
  2. Тримайте CachePages увімкненим для інтерактивного перегляду; вимкніть для одноразових або сценаріїв з високою конкуренцією.
  3. Явно закривайте сесії; скорочуйте TimeOut, коли використання спорадичне.
  4. Використовуйте LargeDoc + за замовчуванням AutoLoad = false на клієнті для великих документів.
  5. Використовуйте DefaultRender = false лише коли потрібна PDF‑проекція з текстом.

Чи була ця сторінка корисною?