Βελτιστοποίηση Απόδοσης

Βελτιστοποίηση απόδοσης και μνήμης

Το προφίλ πόρων του Doconut κυριαρχείται από τρία πράγματα: DPI απόδοσης, τι παραμένει στην προσωρινή μνήμη, και πόσο διαρκούν οι συνεδρίες. Αυτός ο οδηγός περιγράφει τις ρυθμίσεις με σειρά προτεραιότητας.

Ανάλυση — ο μεγαλύτερος μοχλός

ImageResolution (25–300 DPI) οδηγεί τόσο στο χρόνο απόδοσης όσο και στο μέγεθος της εικόνας. Οι περισσότερες μορφές έχουν προεπιλογή 200 DPI· οι εικόνες και τα PSD έχουν προεπιλογή 100.

csharp
// Μια προεπισκόπηση λίστας εγγράφων δεν χρειάζεται ποιότητα εκτύπωσης
var token = await viewer.OpenDocumentAsync(path, new PdfConfig { ImageResolution = 100 });

Η μείωση του DPI στο μισό μειώνει περίπου κατά τέσσερα τον αριθμό των εικονοστοιχείων ανά σελίδα — ταχύτερη απόδοση, μικρότερες μεταφορές, λιγότερη μνήμη προσωρινής αποθήκευσης. Κρατήστε 250–300 DPI για περιπτώσεις με έντονη μεγέθυνση (CAD, τεχνικά σχέδια).

Για PDFs με έντονη ενσωματωμένη εικονογραφία, 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 });

Θυμηθείτε την ανταλλαγή: μετά τη λήξη το widget εμφανίζει 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 — στρατηγική lazy-load για πολύ μεγάλα έγγραφα· οι σελίδες φορτώνονται καθώς ο χρήστης τις προσεγγίζει.
  • AutoLoad = false (προεπιλογή) — μην αποδίδετε μέχρι να καλέσετε πραγματικά το View(token).
  • ShowThumbs = false — παραλείψτε τη δημιουργία/αίτηση μικρογραφιών για προεπισκοπήσεις μονής σελίδας ή ενσωματωμένες.
  • Η ενεργοποίηση του FixedZoom αποτρέπει τις ελεύθερες αλλαγές ζουμ· όταν αντιστοιχίζετε ένα C# ViewerConfig, ρυθμίστε το FixedZoomPercentMobile (προεπιλογή C# 75) για μικρές οθόνες.

Εκκίνηση μία φορά, όχι ανά αίτημα

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance) ανήκει στο Application_Start, δίπλα στο DoconutHost.Initialize — η καταγραφή κωδικοποιήσεων ανά αίτημα είναι σπατάλη εργασίας· η πλήρης παράλειψή του διασπά τα παλιά έγγραφα κωδικοσελίδων.

Το πρώτο έγγραφο μετά από εκκίνηση

Το Doconut φορτώνει τις μηχανές εγγράφων του την πρώτη φορά που ανοίγεται ένα έγγραφο σε μια εφαρμογή — μετά την εκκίνηση της δεσμεύσεως, μετά από κάθε επαναφόρτωση και σε κάθε νέο domain εφαρμογής. Αυτό το πρώτο άνοιγμα είναι πιο αργό από τα επόμενα, και το antivirus σε πραγματικό χρόνο μπορεί να το κάνει πολύ πιο αργό: οι μηχανές φορτώνονται από τη μνήμη, και το Microsoft Defender ελέγχει αυτόν τον κώδικα καθώς φορτώνεται. Η εξαίρεση φακέλου δεν βοηθά, επειδή δεν εμπλέκεται κανένα αρχείο.

Μετρημένο σε μηχάνημα Windows Server 2022 με 4 πυρήνες, το άνοιγμα ενός εγγράφου Word δύο σελίδων:

Πρώτο έγγραφοΚάθε έγγραφο μετά από αυτό
Ασφάλεια Defender σε πραγματικό χρόνο ενεργήπερίπου 70 s0.3–7.5 s, ανάλογα με τη μορφή
Ασφάλεια Defender σε πραγματικό χρόνο ανενεργή12–15 s0.3–7.5 s, ανάλογα με τη μορφή

Πληρώστε το μία φορά, πριν το κάνουν οι χρήστες σας:

  • Κρατήστε τη διαδικασία εργασίας ενεργή: ορίστε το Start Mode της δεσμεύσεως εφαρμογής σε AlwaysRunning, και αυξήστε ή απενεργοποιήστε το idle time-out, ώστε μια ήσυχη νύχτα να μην απελευθερώνει τις μηχανές.
  • Προθερμάνετε το κατά την εκκίνηση: ενεργοποιήστε το IIS Application Initialization (preloadEnabled="true" στον ιστότοπο) και κατευθύνετε το initializationPage σε μια σελίδα σας που ανοίγει ένα μικρό έγγραφο. Ο πρώτος πραγματικός χρήστης τότε βρίσκει τις μηχανές ήδη φορτωμένες.
  • Δώστε χρόνο στο πρώτο αίτημα: ένας έλεγχος υγείας φορτωτή ή ένας upstream proxy με σύντομο χρονικό όριο μπορεί να εγκαταλείψει μια κρύα εκκίνηση που θα είχε επιτυχία.

Το αν θα αλλάξετε τις ρυθμίσεις antivirus σε έναν διακομιστή είναι απόφαση της ομάδας ασφαλείας σας· η παραπάνω προθέρμανση λειτουργεί χωρίς αυτό.

Η δεσμεύση εφαρμογής

Σε έναν μοναδικό διακομιστή, οι συνεδρίες εγγράφων και οι αποθηκευμένες σελίδες ζουν στη διαδικασία εργασίας. Κάθε επαναφόρτωση της δεσμεύσης εφαρμογής — η προγραμματισμένη, μια επεξεργασία του Web.config, ή το idle time-out της δεσμεύσης (20 λεπτά από προεπιλογή στο IIS) — τις καταστρέφει όλες, και οι ανοιχτοί προβολείς τότε εμφανίζουν Document session not found. Please re-open document.

  • Συντονίστε το idle time-out και το πρόγραμμα επαναφόρτωσης της δεσμεύσης με το πόσο διαβάζουν πραγματικά οι χρήστες σας, ή να είστε έτοιμοι να ανοίξετε ξανά τα έγγραφα μετά από επαναφόρτωση.
  • Εκτελέστε τη δεσμεύση ως 64-bit διεργασία (αφήστε το Enable 32-Bit Applications απενεργοποιημένο). Τα μεγάλα έγγραφα χρειάζονται το χώρο διευθύνσεων που δεν έχει μια 32-bit διεργασία εργασίας.
  • Ένα web farm διατηρεί τις συνεδρίες σε κοινόχρηστο αποθηκευτικό χώρο, ώστε μια επαναφόρτωση σε έναν κόμβο να μην τις χάσει — δείτε Συνεδρίες & Ασφάλεια.

Λίστα ελέγχου βελτιστοποίησης

  1. Ορίστε το χαμηλότερο ImageResolution που αποδέχεται η εμπειρία χρήστη (UX) σας.
  2. Κρατήστε το CachePages ενεργό για διαδραστική προβολή· απενεργοποιήστε το για σενάρια μίας διαδρομής ή υψηλής ταυτόχρονης χρήσης.
  3. Κλείστε τις συνεδρίες ρητά· συντομεύστε το TimeOut όπου η χρήση είναι εκρηκτική.
  4. Χρησιμοποιήστε το LargeDoc + προεπιλογή AutoLoad = false στον πελάτη για μεγάλα έγγραφα.
  5. Χρησιμοποιήστε το DefaultRender = false μόνο όταν χρειάζεστε μια προβολή PDF με κείμενο.

Ήταν αυτή η σελίδα χρήσιμη;