Тюнінг продуктивності
Оптимізуйте рендеринг та пам'ять
Профіль ресурсів Doconut домінує три речі: роздільна здатність рендеру, те, що залишається в кеші, і тривалість життя сесій. Цей посібник розглядає важелі у порядку їх впливу.
Роздільна здатність — найбільший важіль
ImageResolution (25–300 DPI) визначає як час рендерингу, так і розмір зображення. Більшість форматів за замовчуванням мають 200 DPI; зображення та PSD — 100.
// Перегляд списку документів не потребує якості друку
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 за перегляд, а не зайняттю ОЗП.
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обмежують рендеринг лише тим, що важливо. - Режим перенаправлення має початкові витрати:
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‑бітному процесі‑робітнику.
- Веб‑ферма зберігає сесії у спільному сховищі, тому перезапуск на одному вузлі не втрачає їх — дивіться Сесії та безпека.
Контрольний список налаштувань
- Встановіть найнижчий
ImageResolution, який приймає ваш UX. - Тримайте
CachePagesувімкненим для інтерактивного перегляду; вимкніть для одноразових або сценаріїв з високою одночасністю. - Явно закривайте сесії; скорочуйте
TimeOutтам, де використання спорадичне. - Використовуйте
LargeDoc+ за замовчуваннямAutoLoad = falseна клієнті для великих документів. - Використовуйте
DefaultRender = falseлише коли потрібна PDF‑проекція з текстом.
Чи була ця сторінка корисною?