ปรับจูนประสิทธิภาพ
เพิ่มประสิทธิภาพการเรนเดอร์และหน่วยความจำ
โปรไฟล์ทรัพยากรของ Doconut ถูกครอบงำโดยสามสิ่ง: ความละเอียดการเรนเดอร์, สิ่งที่ถูกแคชไว้, และ ระยะเวลาที่เซสชันคงอยู่. คู่มือนี้จะอธิบายการปรับตามลำดับผลกระทบ.
ความละเอียด — คันโยกที่ใหญ่ที่สุด
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 px) จำกัดขนาดผลลัพธ์.
การแคชหน้า — หน่วยความจำ vs. การเรนเดอร์ใหม่
BaseConfig.CachePages (ค่าเริ่มต้น true) เก็บทุกหน้าที่เรนเดอร์ไว้ในหน่วยความจำตลอดอายุของเซสชัน. นั่นเป็นค่าเริ่มต้นที่เหมาะสมสำหรับการดูแบบโต้ตอบ — ผู้ใช้เลื่อนขึ้นลง. ปิดมันเมื่อ:
- เอกสารมีขนาดใหญ่และดูเพียงครั้งเดียว, จากหน้าแรกถึงหน้าสุดท้าย,
- เซสชันพร้อมกันหลายรายการจะทำให้จำนวนหน้าที่แคชเพิ่มขึ้นหลายเท่า,
- คุณอยากจ่ายค่า CPU ต่อการดูมากกว่าการเก็บ RAM ไว้.
var token = await viewer.OpenDocumentAsync(path, new PdfConfig { CachePages = false });บนไคลเอนต์, ViewerConfig.CacheEnabled = true โหลดล่วงหน้าหน้าต่างเล็กของภาพหน้าถัดไปในหน่วยความจำของเบราว์เซอร์. มันเป็นแคชการดึงข้อมูลล่วงหน้าต่อการดูหนึ่งครั้ง, ไม่ใช่ localStorage ที่คงที่.
เซสชัน — หน่วยความจำที่คุณไม่เห็น
แต่ละเซสชันที่เปิดจะเก็บโมเดลเอกสารที่แยกวิเคราะห์พร้อมกับ (ด้วย CachePages) หน้าที่เรนเดอร์ไว้, จนกว่า sliding 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 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 s | 0.3–7.5 s, ขึ้นอยู่กับรูปแบบ |
| ปิดการป้องกันแบบเรียลไทม์ของ Defender | 12–15 s | 0.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 ไม่มี.
- เว็บฟาร์มเก็บเซสชันในที่เก็บร่วม, ดังนั้นการรีไซเคิลบนโหนดหนึ่งจะไม่ทำให้สูญหาย — ดูที่ เซสชันและความปลอดภัย.
รายการตรวจสอบการปรับจูน
- ตั้งค่า
ImageResolutionต่ำสุดที่ UX ของคุณยอมรับ. - คงไว้ว่า
CachePagesเปิดสำหรับการดูแบบโต้ตอบ; ปิดสำหรับการดูครั้งเดียวหรือสถานการณ์ที่มีการใช้งานพร้อมกันสูง. - ปิดเซสชันอย่างชัดเจน; ลดระยะเวลา
TimeOutในกรณีที่การใช้งานเป็นช่วงสั้นๆ. - ใช้
LargeDoc+ ค่าเริ่มต้นAutoLoad = falseบนไคลเอนต์สำหรับเอกสารขนาดใหญ่. - ใช้
DefaultRender = falseเฉพาะเมื่อคุณต้องการการฉาย PDF ที่มีข้อความ.
หน้านี้เป็นประโยชน์หรือไม่?