Ajuste de Rendimiento

Optimizar renderizado y memoria

El perfil de recursos de Doconut está dominado por tres cosas: DPI de renderizado, lo que permanece en caché, y cuánto tiempo viven las sesiones. Esta guía recorre las palancas en orden de impacto.

Resolución — la palanca más grande

ImageResolution (25–300 DPI) impulsa tanto el tiempo de renderizado como el tamaño de la imagen. La mayoría de los formatos usan 200 DPI por defecto; las imágenes y PSD usan 100 por defecto.

csharp
// Una vista previa de la lista de documentos no necesita calidad de impresión
var token = await viewer.OpenDocumentAsync(path, new PdfConfig { ImageResolution = 100 });

Reducir a la mitad el DPI reduce aproximadamente a la cuarta parte la cantidad de píxeles por página — renderizados más rápidos, transferencias más pequeñas, menos memoria de caché. Reserva 250–300 DPI para casos de uso con mucho zoom (CAD, dibujos de ingeniería).

Para PDFs con imágenes incrustadas intensas, PdfConfig agrega ajustes más finos: CompressImages + CompressQuality, ResizeImages + ResizeResolution, y CompressFast. Para imágenes simples, ImageConfig.MaxImagePixelSize (predeterminado 3000 px) limita el tamaño de salida.

Caché de página — memoria vs. re-renderizado

BaseConfig.CachePages (por defecto true) mantiene cada página renderizada en memoria durante la vida de la sesión. Ese es el valor predeterminado correcto para la visualización interactiva — los usuarios se desplazan adelante y atrás. Desactívalo cuando:

  • los documentos son enormes y se ven una sola vez, de principio a fin,
  • muchas sesiones concurrentes multiplicarían las páginas en caché,
  • prefieres pagar CPU por vista que mantener RAM.
csharp
var token = await viewer.OpenDocumentAsync(path, new PdfConfig { CachePages = false });

En el cliente, ViewerConfig.CacheEnabled = true precarga una pequeña ventana móvil de imágenes de páginas próximas en la memoria del navegador. Es una caché de precarga por vista, no persistente localStorage.

Sesiones — la memoria que no ves

Cada sesión abierta mantiene el modelo de documento analizado más (con CachePages) sus páginas renderizadas, hasta que el TimeOut deslizante (por defecto 60 minutos) transcurre desde la última solicitud. Dos hábitos mantienen esto bajo control:

  • Cierra lo que ya no necesitas. viewer.CloseDocument(token) libera el motor inmediatamente en lugar de esperar la ventana inactiva.
  • Ajusta el tiempo de espera. Una vista previa que los usuarios miran durante dos minutos no necesita una sesión de una hora:
csharp
var token = await viewer.OpenDocumentAsync(path, new DocOptions { TimeOut = 10 });

Recuerda la compensación: después de expirar el widget muestra Document session not found. Please re-open document. — elige un tiempo de espera que coincida con sesiones de lectura reales.

Conmutadores específicos por formato

  • Excel: MemoryOptimizationPreference está activado por defecto y reduce la huella de memoria al renderizar libros de trabajo muy grandes — déjalo activado, o configúralo en false si prefieres cambiar memoria por una pequeña ganancia de velocidad; SheetNames / PrintArea restringen el renderizado a lo que importa.
  • El modo de redirección tiene un costo inicial: DefaultRender = false convierte el documento completo a PDF al abrirlo. Proporciona búsqueda nativa basada en texto, pero en un documento de 500 páginas la llamada de apertura lleva esa conversión — no lo actives de forma reflexiva.
  • Word/PowerPoint en un servidor sin las fuentes de los documentos: un Windows Server sin Office tiene muchas menos fuentes que una máquina de desarrollo. Las fuentes faltantes provocan una búsqueda lenta de sustitutos y métricas incorrectas; instala las fuentes, o apunta FontFolders a una carpeta que las contenga.

Estrategias del lado del cliente

  • LargeDoc = true — estrategia de carga diferida para documentos muy grandes; las páginas se cargan a medida que el usuario se acerca a ellas.
  • AutoLoad = false (por defecto) — no renderizar hasta que realmente llames a View(token).
  • ShowThumbs = false — omitir la generación/solicitud de miniaturas para vistas previas de una sola página o incrustadas.
  • Activar FixedZoom evita cambios de zoom libres; cuando asignas un ViewerConfig de C#, ajusta FixedZoomPercentMobile (por defecto C# 75) para pantallas pequeñas.

Iniciar una vez, no por solicitud

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance) pertenece a Application_Start, junto a DoconutHost.Initialize — registrar codificaciones por solicitud es trabajo desperdiciado; olvidarlo por completo rompe documentos de página de código heredados.

El primer documento después de un inicio

Doconut carga sus motores de documento la primera vez que se abre un documento en una aplicación — después de que el pool se inicia, después de cada reciclado, y en cada nuevo dominio de aplicación. Esa primera apertura es más lenta que las posteriores, y el antivirus en tiempo real puede hacerla mucho más lenta: los motores se cargan desde la memoria, y Microsoft Defender escanea ese código al cargarlo. Una exclusión de carpeta no ayuda, porque no hay archivo involucrado.

Medido en una máquina Windows Server 2022 de 4 núcleos, al abrir un documento Word de dos páginas:

Primer documentoCada documento posterior
Protección en tiempo real de Defender activadaaprox. 70 s0.3–7.5 s, según el formato
Protección en tiempo real de Defender desactivada12–15 s0.3–7.5 s, según el formato

Págalo una vez, antes que tus usuarios:

  • Mantén el proceso de trabajo activo: establece el Modo de inicio del grupo de aplicaciones en AlwaysRunning, y aumenta o desactiva su tiempo de inactividad, para que una noche tranquila no descargue los motores.
  • Calienta al iniciar: habilita Inicialización de Aplicación de IIS (preloadEnabled="true" en el sitio) y apunta su initializationPage a una página tuya que abra un documento pequeño. El primer usuario real entonces encontrará los motores ya cargados.
  • Da tiempo a la primera solicitud: una verificación de salud del balanceador de carga o un proxy ascendente con un tiempo de espera corto puede renunciar a un inicio en frío que habría tenido éxito.

Si cambiar la configuración del antivirus en un servidor es decisión de tu equipo de seguridad; el calentamiento anterior funciona sin ello.

El grupo de aplicaciones

En un solo servidor, las sesiones de documentos y las páginas en caché viven en el proceso de trabajo. Cada reciclado del grupo de aplicaciones — el programado, una edición de Web.config, o el tiempo de inactividad del pool (20 minutos por defecto en IIS) — los elimina todos, y los visores abiertos entonces muestran Document session not found. Please re-open document.

  • Alinea el tiempo de inactividad y el programa de reciclado del pool con el tiempo que tus usuarios realmente leen, o prepárate para volver a abrir documentos después de un reciclado.
  • Ejecuta el pool como proceso de 64 bits (deja Habilitar aplicaciones de 32 bits desactivado). Los documentos grandes necesitan el espacio de direcciones que un proceso de trabajo de 32 bits no tiene.
  • Una granja web mantiene las sesiones en un almacén compartido, por lo que un reciclado en un nodo no las pierde — ver Sesiones y Seguridad.

Lista de verificación de ajuste

  1. Establece el ImageResolution más bajo que tu UX acepte.
  2. Mantén CachePages activado para visualización interactiva; desactivado para escenarios de una sola pasada o alta concurrencia.
  3. Cierra las sesiones explícitamente; acorta TimeOut donde el uso es intermitente.
  4. Usa LargeDoc + el AutoLoad = false predeterminado en el cliente para documentos grandes.
  5. Usa DefaultRender = false solo cuando necesites una proyección PDF con texto.

¿Fue útil esta página?