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

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

Профіль ресурсів Doconut домінує три речі: роздільна здатність рендеру, те, що залишається в кеші, і тривалість життя сесій. Цей посібник розглядає важелі у порядку їх впливу.

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

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

csharp
// Перегляд списку документів не потребує якості друку
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 пікс.) обмежує розмір вихідного файлу.

Кешування сторінок — пам'ять проти повторного рендерингу

BaseConfig.CachePages (за замовчуванням true) зберігає кожну відрендерену сторінку в пам'яті протягом усього часу життя сесії. Це правильне значення за замовчуванням для інтерактивного перегляду — користувачі прокручують вперед і назад. Вимикайте його, коли:

  • документи величезні і переглядаються один раз, від початку до кінця,
  • багато одночасних сесій множать кешовані сторінки,
  • ви віддаєте перевагу навантаженню CPU за перегляд, а не зайняттю ОЗП.
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 обмежують рендеринг лише тим, що важливо.
  • Режим перенаправлення має початкові витрати: DefaultRender = false конвертує весь документ у PDF під час відкриття. Це забезпечує нативний текстовий пошук, але на документі в 500 сторінок виклик відкриття включає цю конвертацію — не вмикайте його автоматично.
  • Word/PowerPoint на сервері без шрифтів документів: Windows Server без Office має набагато менше шрифтів, ніж робоча машина. Відсутність шрифтів викликає повільне резервне пошук та неправильні метрики; встановіть шрифти або вкажіть FontFolders на папку, що їх містить.

Стратегії на стороні клієнта

  • LargeDoc = true — стратегія «відкладеного завантаження» для дуже великих документів; сторінки завантажуються, коли користувач підходить до них.
  • AutoLoad = false (за замовчуванням) — не рендерити, доки ви не викличете View(token).
  • ShowThumbs = false — пропускати генерацію/запити мініатюр для односторінкових або вбудованих попередніх переглядів.
  • Увімкнення FixedZoom запобігає довільним змінам масштабування; коли ви прив'язуєте C# ViewerConfig, налаштуйте FixedZoomPercentMobile (за замовчуванням C# 75) для малих екранів.

Запуск один раз, а не на кожен запит

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance) розташовується в Application_Start, поруч з DoconutHost.Initialize — реєстрація кодувань на кожен запит є марною роботою; повне їх пропускання руйнує документи зі старими кодовими сторінками.

Перший документ після запуску

Doconut завантажує свої движки документів під час першого відкриття документа в застосунку — після запуску пулу, після кожного перезапуску та у кожному новому домені застосунку. Це перше відкриття повільніше, ніж наступні, і антивірус у реальному часі може значно уповільнити його: движки завантажуються з пам'яті, і Microsoft Defender сканує цей код під час завантаження. Виключення папки не допомагає, оскільки файл не використовується.

Виміряно на 4‑ядерному Windows Server 2022, відкриття двосторінкового документа Word:

Перший документКожен наступний документ
Захист Defender у реальному часі увімкненоблизько 70 с0.3–7.5 с, залежно від формату
Захист Defender у реальному часі вимкнено12–15 с0.3–7.5 с, залежно від формату

Оплатіть один раз, перед вашими користувачами:

  • Підтримуйте процес‑робітник активним: встановіть Start Mode пулу застосунків у AlwaysRunning і збільшіть або вимкніть його idle time-out, щоб під час нічного спокою не вивантажувалися движки.
  • Підігрійте його під час запуску: увімкніть IIS Application Initialization (preloadEnabled="true" на сайті) і вкажіть його initializationPage на вашу сторінку, що відкриває невеликий документ. Перший реальний користувач тоді знайде вже завантажені движки.
  • Дайте першому запиту час: перевірка працездатності балансувальника навантаження або проксі з коротким тайм-аутом може відмовитися від холодного старту, який інакше був би успішним.

Чи змінювати налаштування антивірусу на сервері — рішення вашої команди безпеки; наведене вище прогрівання працює без нього.

Пул застосунків

На одному сервері сесії документів та кешовані сторінки живуть у процесі‑робітнику. Кожне перезапуск пулу застосунків — запланований, зміна Web.config або idle time-out пулу (за замовчуванням 20 хвилин в IIS) — видаляє їх усі, і відкриті переглядачі тоді показують Document session not found. Please re-open document.

  • Синхронізуйте idle time-out пулу та графік перезапуску з тим, як довго ваші користувачі фактично читають, або будьте готові повторно відкривати документи після перезапуску.
  • Запускайте пул як 64‑бітний процес (залиште Enable 32-Bit Applications вимкненим). Великі документи потребують простору адрес, якого немає у 32‑бітному процесі‑робітнику.
  • Веб‑ферма зберігає сесії у спільному сховищі, тому перезапуск на одному вузлі не втрачає їх — дивіться Сесії та безпека.

Контрольний список налаштувань

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

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