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

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

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

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

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

csharp
// پیش‌نمایش فهرست اسناد نیازی به کیفیت چاپ ندارد
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) هر صفحه رندر شده را در حافظه برای طول عمر نشست نگه می‌دارد. این پیش‌فرض مناسب برای مشاهده تعاملی است — کاربران به‌صورت عقب و جلو اسکرول می‌کنند. آن را غیرفعال کنید وقتی:

  • اسناد بسیار بزرگ هستند و یک‌بار به‌صورت از ابتدا تا انتها مشاهده می‌شوند،
  • تعداد زیادی نشست همزمان صفحات کش‌شده را چند برابر می‌کند،
  • ترجیح می‌دهید به‌ازای هر مشاهده CPU مصرف کنید تا حافظه RAM را نگه دارید.
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/PowerPoint بر روی سروری بدون فونت‌های اسناد: یک Windows Server بدون Office فونت‌های بسیار کمتری نسبت به یک ماشین توسعه دارد. فقدان فونت‌ها باعث بررسی بازگشتی کند و معیارهای نادرست می‌شود؛ فونت‌ها را نصب کنید، یا FontFolders را به پوشه‌ای که آن‌ها را دارد اشاره دهید.

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

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

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

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance) باید در Application_Start، کنار DoconutHost.Initialize قرار گیرد — ثبت‌نام رمزگذاری‌ها به‌ازای هر درخواست کاری هدر رفته است؛ فراموش کردن کامل آن اسناد صفحه‌کد قدیمی را خراب می‌کند.

اولین سند پس از راه‌اندازی

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

اندازه‌گیری شده بر روی یک ماشین Windows Server 2022 با ۴ هسته، باز کردن یک سند Word دو صفحه‌ای:

سند اولهر سند پس از آن
حفاظت زمان واقعی Defender فعالحدود ۷۰ ثانیه۰.۳–۷.۵ ثانیه، بسته به فرمت
حفاظت زمان واقعی Defender غیرفعال۱۲–۱۵ ثانیه۰.۳–۷.۵ ثانیه، بسته به فرمت

یک‌بار هزینه را بپردازید، پیش از این که کاربران شما انجام دهند:

  • فرآیند کارگر را زنده نگه دارید: Start Mode استخر برنامه را به AlwaysRunning تنظیم کنید، و idle time-out آن را افزایش یا غیرفعال کنید، تا یک شب ساکت موتورها را از حافظه خارج نکند.
  • در زمان راه‌اندازی گرم کنید: Application Initialization IIS را فعال کنید (preloadEnabled="true" بر روی سایت) و initializationPage آن را به صفحه‌ای از شما که سند کوچکی را باز می‌کند اشاره دهید. سپس اولین کاربر واقعی می‌بیند که موتورها قبلاً بارگذاری شده‌اند.
  • زمان درخواست اول را بدهید: یک بررسی سلامت لود بالانسر یا یک پراکسی بالادست با زمان‌سنجی کوتاه می‌تواند از یک شروع سرد که موفق می‌شد صرف‌نظر کند.

اینکه آیا تنظیمات آنتی‌ویروس را روی سرور تغییر دهید یا نه، تصمیم تیم امنیت شماست؛ گرم‌کردن فوق بدون آن کار می‌کند.

استخر برنامه

در یک سرور واحد، نشست‌های سند و صفحات کش‌شده در فرآیند کارگر زندگی می‌کنند. هر بازسازی استخر برنامه — برنامه‌ریزی‌شده، ویرایشی به Web.config، یا idle time-out استخر (به‌صورت پیش‌فرض ۲۰ دقیقه در IIS) — همه آن‌ها را حذف می‌کند، و نمایشگرهای باز سپس Document session not found. Please re-open document. را نشان می‌دهند.

  • زمان‌سنجی بیکاری و برنامه بازسازی استخر را با مدت زمانی که کاربران شما واقعاً می‌خوانند هم‌راستا کنید، یا آماده باشید که پس از بازسازی اسناد را دوباره باز کنید.
  • استخر را به‌صورت فرآیند ۶۴‑بیتی اجرا کنید (Enable 32-Bit Applications را خاموش بگذارید). اسناد بزرگ به فضای آدرس نیاز دارند که یک فرآیند کارگر ۳۲‑بیتی ندارد.
  • یک وب‌فارم نشست‌ها را در یک ذخیره‌ساز مشترک نگه می‌دارد، بنابراین بازسازی در یک گره آن‌ها را از دست نمی‌دهد — ببینید نشست‌ها و امنیت.

فهرست بررسی تنظیمات

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

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