تحسين الأداء
تحسين العرض والذاكرة
ملف موارد Doconut يهيمن عليه ثلاثة أشياء: دقة العرض DPI، ما يبقى مخزنًا مؤقتًا، و مدة بقاء الجلسات. يشرح هذا الدليل الرافعات حسب تأثيرها.
الدقة — أكبر رافعة
ImageResolution (25–300 DPI) يتحكم في كل من وقت العرض وحجم الصورة. معظم الصيغ الافتراضية 200 DPI؛ الصور و PSD الافتراضية 100.
// معاينة قائمة المستندات لا تحتاج إلى جودة الطباعة
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) يحتفظ بكل صفحة مُعروضة في الذاكرة طوال مدة الجلسة. هذا هو الإعداد الافتراضي المناسب للعرض التفاعلي — المستخدمون يتنقلون للأمام والخلف. قم بإيقافه عندما:
- الوثائق ضخمة وتُعرض مرة واحدة من البداية إلى النهاية،
- عدد كبير من الجلسات المتزامنة سيضاعف عدد الصفحات المخزنة مؤقتًا،
- تفضل دفع استهلاك المعالج لكل عرض بدلاً من احتفاظ بالذاكرة.
var token = await viewer.OpenDocumentAsync(path, new PdfConfig { CachePages = false });على العميل، يقوم ViewerConfig.CacheEnabled = true بتحميل مسبق نافذة صغيرة متحركة من صور الصفحات القادمة في ذاكرة المتصفح. إنها ذاكرة تخزين مؤقت للتحميل المسبق لكل عرض، ليست localStorage مستمرة.
الجلسات — الذاكرة التي لا تراها
كل جلسة مفتوحة تحتفظ بنموذج المستند المُحلل بالإضافة إلى (مع CachePages) صفحاته المعروضة، حتى ينقضي الـ TimeOut المتحرك (الافتراضي 60 دقيقة) منذ آخر طلب. عادتان تحافظان على ذلك تحت السيطرة:
- أغلق ما انتهيت منه. يحرر
viewer.CloseDocument(token)المحرك فورًا بدلاً من الانتظار حتى نافذة الخمول. - ضبط مهلة الوقت بشكل مناسب. المعاينة التي يلمحها المستخدمون لمدة دقيقتين لا تحتاج إلى جلسة ساعة:
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 عند الفتح. يتيح البحث النصي الأصلي، لكن في وثيقة من 500 صفحة يحمل استدعاء الفتح تلك التحويلة — لا تقم بتمكينه بشكل عشوائي. - Word/PowerPoint على خادم بدون خطوط المستندات: خادم Windows بدون Office يحتوي على خطوط أقل بكثير من جهاز التطوير. الخطوط المفقودة تسبب فحصًا بطيئًا للبدائل ومقاييس خاطئة؛ قم بتثبيت الخطوط، أو وجه
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 يفحص هذا الكود أثناء التحميل. استبعاد المجلد لا يُفيد، لأنه لا يوجد ملف متورط.
تم القياس على خادم Windows Server 2022 رباعي النوى، عند فتح مستند Word من صفحتين:
| المستند الأول | كل مستند بعده | |
|---|---|---|
| تشغيل الحماية الفورية من Defender | حوالي 70 ث | 0.3–7.5 ث، حسب الصيغة |
| إيقاف الحماية الفورية من Defender | 12–15 ث | 0.3–7.5 ث، حسب الصيغة |
ادفعها مرة واحدة، قبل أن يدفعها المستخدمون:
- حافظ على بقاء عملية العامل نشطة: اضبط وضع البدء لمجموعة التطبيقات إلى
AlwaysRunning، وزد أو عطل مهلة الخمول، حتى لا تقوم الليلة الهادئة بإلغاء تحميل المحركات. - سخّنها عند البدء: فعّل تهيئة التطبيق في IIS (
preloadEnabled="true"على الموقع) ووجهinitializationPageإلى صفحة من صفحاتك تفتح مستندًا صغيرًا. يجد المستخدم الحقيقي الأول المحركات محملة بالفعل. - امنح الطلب الأول وقتًا: فحص صحة موازن التحميل أو وكيل أمامي بمهلة قصيرة يمكنه التخلي عن بدء بارد كان سيفشل.
ما إذا كان يجب تغيير إعدادات مكافحة الفيروسات على الخادم هو قرار فريق الأمان الخاص بكم؛ عملية الإحماء أعلاه تعمل دونها.
مجموعة التطبيقات
على خادم واحد، تعيش جلسات المستندات والصفحات المخزنة مؤقتًا في عملية العامل. كل إعادة تدوير لمجموعة التطبيقات — المجدولة، تعديل إلى Web.config، أو مهلة الخمول للمجموعة (20 دقيقة افتراضيًا في IIS) — تحذفها جميعًا، ثم تُظهر عارضات الفتح Document session not found. Please re-open document.
- قم بمواءمة مهلة الخمول وجدول إعادة التدوير لمجموعة التطبيقات مع مدة قراءة المستخدمين الفعلية، أو كن مستعدًا لإعادة فتح المستندات بعد إعادة التدوير.
- شغّل المجموعة كعملية 64-بت (اترك Enable 32-Bit Applications معطلة). المستندات الكبيرة تحتاج مساحة عنوان لا تتوفر في عملية عامل 32-بت.
- يحتفظ مزرعة الويب بالجلسات في مخزن مشترك، لذا لا تفقدها إعادة التدوير على عقدة واحدة — انظر الجلسات والأمان.
قائمة التحقق من الضبط
- اضبط أدنى
ImageResolutionيقبله تجربة المستخدم الخاصة بك. - احتفظ بـ
CachePagesمفعّلاً للعرض التفاعلي؛ عطلها للسيناريوهات ذات المرور الواحد أو التزامن العالي. - أغلق الجلسات صراحةً؛ قلل
TimeOutحيث يكون الاستخدام متقلبًا. - استخدم
LargeDoc+ الافتراضيAutoLoad = falseعلى العميل للمستندات الكبيرة. - استخدم
DefaultRender = falseفقط عندما تحتاج إلى إسقاط PDF يحتوي على نص.
هل كانت هذه الصفحة مفيدة؟