ปรับจูนประสิทธิภาพ

เพิ่มประสิทธิภาพการเรนเดอร์และหน่วยความจำ

โปรไฟล์ทรัพยากรของ Doconut ถูกครอบงำโดยสามสิ่ง: ความละเอียดการเรนเดอร์, สิ่งที่ถูกแคชไว้, และ ระยะเวลาที่เซสชันคงอยู่. คู่มือนี้จะอธิบายการปรับตามลำดับผลกระทบ.

ความละเอียด — คันโยกที่ใหญ่ที่สุด

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 px) จำกัดขนาดผลลัพธ์.

การแคชหน้า — หน่วยความจำ vs. การเรนเดอร์ใหม่

BaseConfig.CachePages (ค่าเริ่มต้น true) เก็บทุกหน้าที่เรนเดอร์ไว้ในหน่วยความจำตลอดอายุของเซสชัน. นั่นเป็นค่าเริ่มต้นที่เหมาะสมสำหรับการดูแบบโต้ตอบ — ผู้ใช้เลื่อนขึ้นลง. ปิดมันเมื่อ:

  • เอกสารมีขนาดใหญ่และดูเพียงครั้งเดียว, จากหน้าแรกถึงหน้าสุดท้าย,
  • เซสชันพร้อมกันหลายรายการจะทำให้จำนวนหน้าที่แคชเพิ่มขึ้นหลายเท่า,
  • คุณอยากจ่ายค่า CPU ต่อการดูมากกว่าการเก็บ RAM ไว้.
csharp
var token = await viewer.OpenDocumentAsync(path, new PdfConfig { CachePages = false });

บนไคลเอนต์, ViewerConfig.CacheEnabled = true โหลดล่วงหน้าหน้าต่างเล็กของภาพหน้าถัดไปในหน่วยความจำของเบราว์เซอร์. มันเป็นแคชการดึงข้อมูลล่วงหน้าต่อการดูหนึ่งครั้ง, ไม่ใช่ localStorage ที่คงที่.

เซสชัน — หน่วยความจำที่คุณไม่เห็น

แต่ละเซสชันที่เปิดจะเก็บโมเดลเอกสารที่แยกวิเคราะห์พร้อมกับ (ด้วย CachePages) หน้าที่เรนเดอร์ไว้, จนกว่า sliding 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 เปิดโดยค่าเริ่มต้น และลดการใช้หน่วยความจำเมื่อเรนเดอร์สมุดงานขนาดใหญ่มาก — ควรเปิดไว้, หรือตั้งค่าเป็น 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 — การลงทะเบียนการเข้ารหัสต่อคำขอเป็นงานที่เสียเปล่า; ลืมทำเลยจะทำให้เอกสาร code-page เก่าเสีย.

เอกสารแรกหลังจากการเริ่มต้น

Doconut โหลดเอนจินเอกสารของมันครั้งแรกเมื่อเปิดเอกสารในแอปพลิเคชัน — หลังจากพูลเริ่มทำงาน, หลังจากการรีไซเคิลทุกครั้ง, และในโดเมนแอปพลิเคชันใหม่ทุกครั้ง. การเปิดครั้งแรกนั้นช้ากว่าครั้งต่อๆ ไป, และ แอนตี้ไวรัสแบบเรียลไทม์สามารถทำให้ช้ากว่านั้น: เอนจินถูกโหลดจากหน่วยความจำ, และ Microsoft Defender สแกนโค้ดขณะโหลด. การยกเว้นโฟลเดอร์ไม่ช่วย, เพราะไม่มีไฟล์ที่เกี่ยวข้อง.

วัดบนเครื่อง Windows Server 2022 4 คอร์, การเปิดเอกสาร Word สองหน้าดังนี้:

เอกสารแรกเอกสารต่อๆ ไป
เปิดการป้องกันแบบเรียลไทม์ของ Defenderประมาณ 70 s0.3–7.5 s, ขึ้นอยู่กับรูปแบบ
ปิดการป้องกันแบบเรียลไทม์ของ Defender12–15 s0.3–7.5 s, ขึ้นอยู่กับรูปแบบ

จ่ายค่าเดียว, ก่อนที่ผู้ใช้ของคุณจะทำ:

  • รักษา worker process ให้ทำงานต่อ: ตั้ง Start Mode ของ application pool เป็น AlwaysRunning, และเพิ่มหรือปิดการทำงานของ idle time-out, เพื่อให้คืนที่เงียบไม่ทำให้เอนจินถูก unload.
  • เตรียมให้พร้อมตั้งแต่เริ่มต้น: เปิดใช้งาน IIS Application Initialization (preloadEnabled="true" บนไซต์) และชี้ initializationPage ไปยังหน้าที่เปิดเอกสารเล็ก. ผู้ใช้จริงคนแรกจะพบว่าเอนจินโหลดแล้ว.
  • ให้เวลาการร้องขอแรก: การตรวจสอบสุขภาพของ load balancer หรือพร็อกซีต้นทางที่มี timeout สั้นสามารถยกเลิกการเริ่มต้นเย็นที่อาจสำเร็จได้.

การเปลี่ยนการตั้งค่าแอนตี้ไวรัสบนเซิร์ฟเวอร์เป็นการตัดสินใจของทีมความปลอดภัยของคุณ; การเตรียมความพร้อมข้างต้นทำงานได้โดยไม่ต้องใช้.

พูลแอปพลิเคชัน

บนเซิร์ฟเวอร์เดียว, เซสชันเอกสารและหน้าที่แคชอยู่ใน worker process. ทุกการรีไซเคิลของ application pool — ที่กำหนดเวลาไว้, การแก้ไข Web.config, หรือ idle time-out ของพูล (ค่าเริ่มต้น 20 นาทีใน IIS) — จะทำให้ทั้งหมดหาย, และผู้ดูเอกสารที่เปิดจะแสดง Document session not found. Please re-open document.

  • ปรับ idle time-out และตารางการรีไซเคิลของพูลให้สอดคล้องกับระยะเวลาที่ผู้ใช้ของคุณอ่านจริง, หรือเตรียมพร้อมเปิดเอกสารใหม่หลังการรีไซเคิล.
  • รันพูลเป็นกระบวนการ 64-bit (ปิด Enable 32-Bit Applications). เอกสารขนาดใหญ่ต้องการพื้นที่ที่อยู่ที่กระบวนการ worker 32-bit ไม่มี.
  • เว็บฟาร์มเก็บเซสชันในที่เก็บร่วม, ดังนั้นการรีไซเคิลบนโหนดหนึ่งจะไม่ทำให้สูญหาย — ดูที่ เซสชันและความปลอดภัย.

รายการตรวจสอบการปรับจูน

  1. ตั้งค่า ImageResolution ต่ำสุดที่ UX ของคุณยอมรับ.
  2. คงไว้ว่า CachePages เปิดสำหรับการดูแบบโต้ตอบ; ปิดสำหรับการดูครั้งเดียวหรือสถานการณ์ที่มีการใช้งานพร้อมกันสูง.
  3. ปิดเซสชันอย่างชัดเจน; ลดระยะเวลา TimeOut ในกรณีที่การใช้งานเป็นช่วงสั้นๆ.
  4. ใช้ LargeDoc + ค่าเริ่มต้น AutoLoad = false บนไคลเอนต์สำหรับเอกสารขนาดใหญ่.
  5. ใช้ DefaultRender = false เฉพาะเมื่อคุณต้องการการฉาย PDF ที่มีข้อความ.

หน้านี้เป็นประโยชน์หรือไม่?