Dostosowanie wydajności
Optymalizacja renderowania i pamięci
Profil zasobów Doconut jest zdominowany przez trzy elementy: render DPI, co pozostaje w pamięci podręcznej, i jak długo trwają sesje. Ten przewodnik omawia dźwignie w kolejności ich wpływu.
Rozdzielczość — największa dźwignia
ImageResolution (25–300 DPI) wpływa zarówno na czas renderowania, jak i rozmiar obrazu. Większość formatów domyślnie ma 200 DPI; obrazy i PSD domyślnie 100.
// Podgląd listy dokumentów nie wymaga jakości druku
var token = await viewer.OpenDocumentAsync(path, new PdfConfig { ImageResolution = 100 });Zmniejszenie DPI o połowę przybliża się do czterokrotnego zmniejszenia liczby pikseli na stronę — szybsze renderowanie, mniejsze transfery, mniej pamięci podręcznej. Zachowaj 250–300 DPI dla przypadków intensywnego powiększania (CAD, rysunki inżynierskie).
Dla plików PDF z dużą ilością osadzonych obrazów, PdfConfig dodaje precyzyjniejsze ustawienia: CompressImages + CompressQuality, ResizeImages + ResizeResolution oraz CompressFast. Dla zwykłych obrazów, ImageConfig.MaxImagePixelSize (domyślnie 3000 px) ogranicza rozmiar wyjścia.
Buforowanie stron — pamięć vs. ponowne renderowanie
BaseConfig.CachePages (domyślnie true) przechowuje każdą wyrenderowaną stronę w pamięci przez cały czas trwania sesji. To właściwe ustawienie domyślne dla interaktywnego przeglądania — użytkownicy przewijają w przód i w tył. Wyłącz je, gdy:
- dokumenty są ogromne i przeglądane jednorazowo, od początku do końca,
- wiele jednoczesnych sesji pomnożyłoby liczbę buforowanych stron,
- wolisz płacić CPU za każde wyświetlenie niż zajmować RAM.
var token = await viewer.OpenDocumentAsync(path, new PdfConfig { CachePages = false });Po stronie klienta, ViewerConfig.CacheEnabled = true wstępnie ładuje małe przesuwające się okno nadchodzących obrazów stron w pamięci przeglądarki. Jest to bufor prefetch per‑widok, a nie trwały localStorage.
Sesje — pamięć, której nie widzisz
Każda otwarta sesja przechowuje przetworzony model dokumentu plus (z CachePages) jego wyrenderowane strony, aż do upłynięcia przesuwającego się TimeOut (domyślnie 60 minut) od ostatniego żądania. Dwa nawyki utrzymują to pod kontrolą:
- Zamknij to, czego już nie potrzebujesz.
viewer.CloseDocument(token)zwalnia silnik natychmiast, zamiast czekać na okno bezczynności. - Dopasuj rozmiar limitu czasu. Podgląd, na który użytkownicy patrzą przez dwie minuty, nie wymaga godziny sesji:
var token = await viewer.OpenDocumentAsync(path, new DocOptions { TimeOut = 10 });Pamiętaj o kompromisie: po wygaśnięciu widżet pokazuje Document session not found. Please re-open document. — wybierz limit czasu, który odpowiada rzeczywistym sesjom czytania.
Przełączniki specyficzne dla formatu
- Excel:
MemoryOptimizationPreferencejest domyślnie włączone i zmniejsza zużycie pamięci przy renderowaniu bardzo dużych skoroszytów — pozostaw je włączone, lub ustaw nafalsejeśli wymienisz pamięć na niewielki przyrost szybkości;SheetNames/PrintAreaograniczają renderowanie do tego, co istotne. - Tryb przekierowania ma koszt początkowy:
DefaultRender = falsekonwertuje cały dokument na PDF w momencie otwarcia. Zapewnia natywne wyszukiwanie tekstowe, ale przy dokumencie 500‑stronnicowym wywołanie otwarcia niesie tę konwersję — nie włączaj go automatycznie. - Word/PowerPoint na serwerze bez czcionek dokumentów: Windows Server bez Office ma znacznie mniej czcionek niż maszyna deweloperska. Brakujące czcionki powodują wolne próby zastępcze i nieprawidłowe metryki; zainstaluj czcionki lub wskaż
FontFoldersna folder, który je zawiera.
Strategie po stronie klienta
LargeDoc = true— strategia leniwego ładowania dla bardzo dużych dokumentów; strony ładują się, gdy użytkownik się do nich zbliża.AutoLoad = false(domyślnie) — nie renderuj, dopóki nie wywołaszView(token).ShowThumbs = false— pomijaj generowanie miniatur/żądania dla podglądów jednosktronicowych lub osadzonych.- Włączenie
FixedZoomzapobiega dowolnym zmianom zoomu; gdy mapujesz C#ViewerConfig, dostosujFixedZoomPercentMobile(domyślnie C# 75) dla małych ekranów.
Uruchamianie raz, nie przy każdym żądaniu
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance) należy umieścić w Application_Start, obok DoconutHost.Initialize — rejestrowanie kodowań przy każdym żądaniu to zmarnowana praca; całkowite pominięcie tego psuje starsze dokumenty o kodowaniu stron kodowych.
Pierwszy dokument po uruchomieniu
Doconut ładuje swoje silniki dokumentów przy pierwszym otwarciu dokumentu w aplikacji — po uruchomieniu puli, po każdym recyklingu i w każdej nowej domenie aplikacji. To pierwsze otwarcie jest wolniejsze niż kolejne, a antywirus w czasie rzeczywistym może je znacznie spowolnić: silniki są ładowane z pamięci, a Microsoft Defender skanuje ten kod podczas ładowania. Wykluczenie folderu nie pomaga, ponieważ nie jest zaangażowany żaden plik.
Zmierzono na czterordzeniowym serwerze Windows Server 2022, otwierając dwustronicowy dokument Word:
| Pierwszy dokument | Każdy kolejny dokument | |
|---|---|---|
| Ochrona w czasie rzeczywistym Defender włączona | około 70 s | 0.3–7.5 s, w zależności od formatu |
| Ochrona w czasie rzeczywistym Defender wyłączona | 12–15 s | 0.3–7.5 s, w zależności od formatu |
Zapłać raz, zanim zrobią to Twoi użytkownicy:
- Utrzymuj proces roboczy aktywny: ustaw Start Mode puli aplikacji na
AlwaysRunningi podnieś lub wyłącz idle time-out, aby nocna cisza nie wyładowała silników. - Rozgrzej go przy starcie: włącz Application Initialization IIS (
preloadEnabled="true"na stronie) i wskaż jegoinitializationPagena swoją stronę, która otwiera mały dokument. Pierwszy prawdziwy użytkownik znajdzie wtedy silniki już załadowane. - Daj pierwszemu żądaniu czas: kontrola stanu load balancera lub proxy upstream z krótkim limitem czasu może zrezygnować z zimnego startu, który by się powiódł.
Decyzja o zmianie ustawień antywirusa na serwerze należy do zespołu ds. bezpieczeństwa; powyższe rozgrzewanie działa bez niego.
Pula aplikacji
Na pojedynczym serwerze sesje dokumentów i buforowane strony znajdują się w procesie roboczym. Każdy recykling puli aplikacji — zaplanowany, edycja Web.config lub idle time-out puli (domyślnie 20 minut w IIS) — usuwa je wszystkie, a otwarte przeglądarki wtedy pokazują Document session not found. Please re-open document.
- Dostosuj idle time-out puli i harmonogram recyklingu do tego, jak długo użytkownicy faktycznie czytają, lub bądź gotów ponownie otworzyć dokumenty po recyklingu.
- Uruchamiaj pulę jako proces 64‑bitowy (pozostaw Enable 32-Bit Applications wyłączone). Duże dokumenty potrzebują przestrzeni adresowej, której proces 32‑bitowy nie ma.
- Farma sieciowa przechowuje sesje w wspólnym magazynie, więc recykling jednego węzła nie powoduje ich utraty — zobacz Sesje i bezpieczeństwo.
Lista kontrolna dostrajania
- Ustaw najniższy
ImageResolution, jaki akceptuje Twoje UX. - Pozostaw
CachePageswłączone dla interaktywnego przeglądania; wyłączone w scenariuszach jednorazowego przeglądu lub wysokiej współbieżności. - Zamykaj sesje jawnie; skróć
TimeOuttam, gdzie użycie jest przerywane. - Użyj
LargeDoc+ domyślnegoAutoLoad = falsepo stronie klienta dla dużych dokumentów. - Użyj
DefaultRender = falsetylko wtedy, gdy potrzebujesz PDF z tekstem.
Czy ta strona była pomocna?