כוונון ביצועים

אופטימיזציה של רינדור וזיכרון

פרופיל המשאבים של 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, שרטוטים הנדסיים).

ל‑PDFים עם תמונות משולבות רבות, PdfConfig מוסיף כוונים מדויקים יותר: CompressImages + CompressQuality, ResizeImages + ResizeResolution, ו‑CompressFast. לתמונות רגילות, ImageConfig.MaxImagePixelSize (ברירת מחדל 3000 פיקסלים) מגביל את גודל הפלט.

קאשינג דפים — זיכרון מול רינדור מחדש

BaseConfig.CachePages (ברירת מחדל true) שומר כל דף מרונדר בזיכרון לכל אורך חיי הסשן. זהו ברירת המחדל הנכונה לצפייה אינטראקטיבית — משתמשים גוללים קדימה ואחורה. כבה אותו כאשר:

  • המסמכים גדולים ונצפים פעם אחת, מההתחלה עד הסוף,
  • ריבוי סשנים במקביל יגדיל את מספר הדפים במטמון,
  • עדיף לשלם במעבד לכל צפייה מאשר להחזיק 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 });

זכור את הפשרה: לאחר הפקיעה הווידג'ט מציג Document session not found. Please re-open document. — בחר משך זמן שתואם לסשנים אמיתיים של קריאה.

מתגים ספציפיים לפורמט

  • Excel: MemoryOptimizationPreference הוא פעיל כברירת מחדל ומפחית את footprint הזיכרון בעת רינדור חוברות גדולות מאוד — השאר אותו פעיל, או הגדר אותו ל‑false אם אתה מוכן להחליף זיכרון בתמורה לשיפור מהירות קטן; SheetNames / PrintArea מגבילים את הרינדור למה שחשוב.
  • מצב הפנייה (Redirect) בעל עלות מוקדמת: DefaultRender = false ממיר את כל המסמך ל‑PDF בזמן הפתיחה. זה מאפשר חיפוש טקסטואלי מובנה, אך במסמך של 500 עמודים קריאת הפתיחה כוללת המרה זו — אל תפעיל אותו באופן אוטומטי.
  • Word/PowerPoint על שרת ללא גופני המסמכים: Windows Server ללא Office מכיל הרבה פחות גופנים ממחשב פיתוח. גופנים חסרים גורמים לבדיקה איטית של fallback ולמדדים שגויים; התקן את הגופנים, או הפנה את 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 סורק את הקוד בזמן הטעינה. החרגה של תיקייה אינה מועילה, מכיוון שאין קובץ מעורב.

המסמך הראשוןכל מסמך לאחריו
הגנה בזמן אמת של Defender מופעלתכ‑70 שנ'0.3–7.5 שנ', תלוי בפורמט
הגנה בזמן אמת של Defender מושבתת12–15 שנ'0.3–7.5 שנ', תלוי בפורמט

שלם זאת פעם אחת, לפני שהמשתמשים שלך יעשו זאת:

  • שמור על תהליך העובד פעיל: הגדר את Start Mode של בריכת האפליקציה ל‑AlwaysRunning, והעלה או בטל את idle time-out, כך שבלילה שקט המנועים לא ייפלטו.
  • חמם אותו בהפעלה: אפשר את Application Initialization של IIS (preloadEnabled="true" באתר) והפנה את initializationPage לעמוד שלך שמפתח מסמך קטן. המשתמש האמיתי הראשון ימצא את המנועים כבר טעונים.
  • תן זמן לבקשה הראשונה: בדיקת בריאות של מאזן עומסים או פרוקסי קידמי עם timeout קצר יכולים לוותר על אתחול קר שהייתה מצליחה.

האם לשנות את הגדרות האנטי‑וירוס בשרת הוא החלטת צוות האבטחה שלכם; החימום שלמעלה פועל גם ללא זה.

בריכת האפליקציה

בשרת יחיד, סשני המסמכים והדפים במטמון מתגוררים בתהליך העובד. כל מחזור של בריכת האפליקציה — המתוזמן, עריכה של 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 אינו מספק.
  • חוות ווב שומרת סשנים באחסון משותף, כך שמחזור באחד הצמתים לא מאבד אותם — ראה סשנים ואבטחה.

רשימת בדיקות לכוונון

  1. הגדר את ה‑ImageResolution הנמוך ביותר שה‑UX שלכם מקבל.
  2. השאר את CachePages פעיל לצפייה אינטראקטיבית; כבוי לתרחישים של קריאה חד‑פעמית או קונקורנטיות גבוהה.
  3. סגור סשנים במפורש; קצץ את TimeOut במקרים של שימוש מתפרץ.
  4. השתמש ב‑LargeDoc + ברירת המחדל של AutoLoad = false בצד הלקוח למסמכים גדולים.
  5. השתמש ב‑DefaultRender = false רק כאשר אתה צריך פרוייקציית PDF עם טקסט.

האם דף זה היה מועיל?