بهینه‌سازی عملکرد

بهینه‌سازی رندرینگ و حافظه

پروفایل منابع Doconut توسط سه مورد حاکم است: وضوح رندر, آنچه در کش می‌ماند, و مدت زمان زندگی جلسات. این راهنما اهرم‌ها را به ترتیب تأثیرشان بررسی می‌کند.

وضوح — بزرگ‌ترین اهرم

ImageResolution (۲۵–۳۰۰ DPI) هر دو زمان رندر و اندازه تصویر را تعیین می‌کند. اکثر فرمت‌ها به‌صورت پیش‌فرض ۲۰۰ DPI هستند؛ تصاویر و PSD به‌صورت پیش‌فرض ۱۰۰ هستند.

csharp
// A document list preview doesn't need print quality
var token = await viewer.OpenDocumentAsync(path, new PdfConfig { ImageResolution = 100 });

نصف کردن DPI تقریباً تعداد پیکسل‌ها در هر صفحه را به‌یک‌چهارم می‌کاهد — رندرهای سریع‌تر، انتقال‌های کوچکتر، حافظه کش کمتر. برای موارد استفاده با زوم زیاد (CAD، نقشه‌های مهندسی) DPI بین ۲۵۰–۳۰۰ را رزرو کنید.

برای PDFهایی که دارای تصاویر جاسازی‌شده زیاد هستند، PdfConfig تنظیمات دقیق‌تری اضافه می‌کند: CompressImages + CompressQuality، ResizeImages + ResizeResolution، و CompressFast. برای تصاویر ساده، ImageConfig.MaxImagePixelSize (به‌صورت پیش‌فرض ۳۰۰۰ پیکسل) اندازه خروجی را محدود می‌کند.

کش‌گذاری صفحات — حافظه در مقابل رندر مجدد

BaseConfig.CachePages (به‌صورت پیش‌فرض true) هر صفحه رندر شده را در حافظه برای طول عمر جلسه نگه می‌دارد. این پیش‌فرض مناسب برای مشاهده تعاملی است — کاربران به‌صورت عقب و جلو اسکرول می‌کنند. آن را خاموش کنید وقتی:

  • اسناد بسیار بزرگ هستند و یک‌بار از ابتدا تا انتها مشاهده می‌شوند،
  • جلسات همزمان زیاد باعث می‌شود صفحات کش‌شده چند برابر شوند،
  • ترجیح می‌دهید به‌جای نگه‌داشتن RAM، هزینه CPU را به‌ازای هر مشاهده بپردازید.
csharp
var token = await viewer.OpenDocumentAsync(path, new PdfConfig { CachePages = false });

در سمت کلاینت، ViewerConfig.CacheEnabled = true یک پنجره کوچک متحرک از تصاویر صفحات آینده را در حافظه مرورگر پیش‌بارگذاری می‌کند. این یک کش پیش‌دریافت برای هر مشاهده است، نه localStorage دائمی.

جلسات — حافظه‌ای که نمی‌بینید

هر جلسه باز مدل سند تجزیه‌شده را به‌همراه (با CachePages) صفحات رندر شده‌اش نگه می‌دارد، تا زمانی که TimeOut متغیر (به‌صورت پیش‌فرض ۶۰ دقیقه) پس از آخرین درخواست تمام شود. دو عادت این را تحت کنترل نگه می‌دارند:

  • آنچه کارتان تمام شده است را ببندید. viewer.CloseDocument(token) بلافاصله موتور را آزاد می‌کند به‌جای انتظار برای پنجره بیکاری.
  • زمان‌سنجی را به‌درستی تنظیم کنید. پیش‌نمایشی که کاربران به‌مدت دو دقیقه نگاه می‌کنند نیازی به جلسه یک ساعته ندارد:
csharp
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 تبدیل می‌کند. این امکان جستجوی بومی مبتنی بر متن را فراهم می‌کند، اما برای سندی با ۵۰۰ صفحه، فراخوانی باز کردن آن تبدیل را به‌همراه دارد — به‌صورت خودکار آن را فعال نکنید.
  • Word/PPT روی Linux/Docker: نبود فونت‌ها باعث بررسی بازگشت آهسته و معیارهای نادرست می‌شود؛ FontFolders را به دایرکتوری حاوی فونت‌های خود اشاره دهید.
  • ارائه‌ها روی Linux/macOS: فایل‌های PPT/PPTX/PPS/POT/ODP می‌توانند باز شوند، اما رندر با موتور ارائه فعلی به libgdiplus بومی و سوئیچ زمان اجرا System.Drawing.EnableUnixSupport=true نیاز دارد. سایر خانواده‌های فرمت از مسیر رندرینگ معمولی چندپلتفرمی استفاده می‌کنند.

استراتژی‌های سمت کلاینت

  • LargeDoc = true — استراتژی بارگذاری تنبل برای اسناد بسیار بزرگ؛ صفحات زمانی که کاربر به آن‌ها نزدیک می‌شود بارگذاری می‌شوند.
  • AutoLoad = false (پیش‌فرض) — تا زمانی که واقعاً View(token) را صدا نزنید رندر نمی‌شود.
  • ShowThumbs = false — تولید/درخواست تصویر بندانگشتی برای پیش‌نمایش‌های تک‌صفحه یا توکار را نادیده بگیرید.
  • فعال‌سازی FixedZoom از تغییرات زوم آزاد جلوگیری می‌کند؛ وقتی یک ViewerConfig C# را نگاشت می‌کنید، FixedZoomPercentMobile (پیش‌فرض C# ۷۵) را برای صفحه‌نمایش‌های کوچک تنظیم کنید.

یک‌بار راه‌اندازی، نه به‌ازای هر درخواست

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance) باید در Program.cs قرار گیرد — ثبت‌نام انکودینگ‌ها به‌ازای هر درخواست کار هدر رفته‌ای است؛ فراموش کردن کامل آن اسناد کد‑صفحهٔ قدیمی را خراب می‌کند.

توزیع کار بین گره‌ها

همه موارد بالا رندر یک گره را به‌صورت درخواست‌شده تنظیم می‌کند. وقتی یک گره واحد نتواند بار را جذب کند، اهرم بعدی یک دایال بزرگ‌تر نیست — بلکه انتشار یک‌بار آثار سند در ذخیره‌سازی مشترک و اجازه دادن به تمام گره‌ها برای سرویس‌دهی به آن‌هاست. این مدل هزینه را تغییر می‌دهد: رندر یک‌بار برای هر سند انجام می‌شود نه یک‌بار برای هر جلسه، و درخواست‌های صفحه به خواندن فایل تبدیل می‌شوند. ببینید استقرارهای توزیع‌شده.

فهرست بررسی بهینه‌سازی

  1. پایین‌ترین ImageResolution که تجربه کاربری شما می‌پذیرد تنظیم کنید.
  2. CachePages را برای مشاهده تعاملی فعال نگه دارید؛ برای سناریوهای یک‌بار یا همزمانی بالا آن را غیرفعال کنید.
  3. جلسات را به‌صورت صریح ببندید؛ TimeOut را در موارد استفاده پرشتاب کوتاه کنید.
  4. در کلاینت برای اسناد بزرگ از LargeDoc به‌همراه پیش‌فرض AutoLoad = false استفاده کنید.
  5. فقط زمانی که به یک پروجکشن PDF حاوی متن نیاز دارید از DefaultRender = false استفاده کنید.

آیا این صفحه مفید بود؟