Tinh chỉnh hiệu năng

Tối ưu việc render và bộ nhớ

Hồ sơ tài nguyên của Doconut bị chi phối bởi ba yếu tố: độ DPI render, cái gì được lưu trong bộ nhớ đệm, và thời gian các phiên tồn tại. Hướng dẫn này sẽ đi qua các công tắc theo thứ tự ảnh hưởng.

Độ phân giải — công tắc lớn nhất

ImageResolution (25–300 DPI) điều khiển cả thời gian render và kích thước ảnh. Hầu hết các định dạng mặc định là 200 DPI; ảnh và PSD mặc định là 100.

csharp
// Bản xem trước danh sách tài liệu không cần chất lượng in
var token = await viewer.OpenDocumentAsync(path, new PdfConfig { ImageResolution = 100 });

Giảm một nửa DPI sẽ giảm khoảng một phần tư số pixel trên mỗi trang — render nhanh hơn, truyền tải nhỏ hơn, bộ nhớ đệm ít hơn. Dành 250–300 DPI cho các trường hợp sử dụng nhiều thu phóng (CAD, bản vẽ kỹ thuật).

Đối với PDF có nhiều hình ảnh nhúng, PdfConfig thêm các điều chỉnh chi tiết: CompressImages + CompressQuality, ResizeImages + ResizeResolution, và CompressFast. Đối với hình ảnh đơn giản, ImageConfig.MaxImagePixelSize (mặc định 3000 px) giới hạn kích thước đầu ra.

Bộ nhớ đệm trang — bộ nhớ vs. render lại

BaseConfig.CachePages (mặc định true) giữ mọi trang đã render trong bộ nhớ suốt thời gian phiên. Đây là mặc định phù hợp cho việc xem tương tác — người dùng cuộn lên xuống. Tắt nó khi:

  • tài liệu quá lớn và chỉ xem một lần, từ đầu đến cuối,
  • nhiều phiên đồng thời sẽ nhân lên số trang được lưu trong bộ nhớ đệm,
  • bạn muốn trả phí CPU cho mỗi lần xem hơn là giữ RAM.
csharp
var token = await viewer.OpenDocumentAsync(path, new PdfConfig { CachePages = false });

Ở phía client, ViewerConfig.CacheEnabled = true tải trước một cửa sổ di động nhỏ của các ảnh trang sắp tới trong bộ nhớ trình duyệt. Đó là bộ nhớ đệm prefetch cho mỗi lần xem, không phải localStorage bền vững.

Phiên — bộ nhớ mà bạn không thấy

Mỗi phiên mở giữ mô hình tài liệu đã phân tích cộng với (với CachePages) các trang đã render, cho đến khi thời gian trượt TimeOut (mặc định 60 phút) hết kể từ yêu cầu cuối cùng. Hai thói quen giúp kiểm soát điều này:

  • Đóng những gì bạn đã xong. viewer.CloseDocument(token) giải phóng engine ngay lập tức thay vì chờ cửa sổ nhàn rỗi.
  • Điều chỉnh thời gian chờ phù hợp. Một bản xem trước mà người dùng chỉ nhìn trong hai phút không cần một phiên một giờ:
csharp
var token = await viewer.OpenDocumentAsync(path, new DocOptions { TimeOut = 10 });

Hãy nhớ sự đánh đổi: sau khi hết hạn widget sẽ hiển thị Document session not found. Please re-open document. — chọn thời gian chờ phù hợp với các phiên đọc thực tế.

Công tắc riêng cho định dạng

  • Excel: MemoryOptimizationPreference được bật mặc định và giảm lượng bộ nhớ khi render các workbook rất lớn — để nó bật, hoặc đặt thành false nếu bạn muốn đổi bộ nhớ lấy một chút tăng tốc; SheetNames / PrintArea giới hạn việc render chỉ những gì quan trọng.
  • Chế độ chuyển hướng có chi phí ban đầu: DefaultRender = false chuyển đổi toàn bộ tài liệu sang PDF khi mở. Nó cho phép tìm kiếm dựa trên văn bản gốc, nhưng trên tài liệu 500 trang, lời gọi mở sẽ mang theo quá trình chuyển đổi — không bật nó một cách phản xạ.
  • Word/PowerPoint trên máy chủ không có phông chữ của tài liệu: Windows Server không có Office có ít phông chữ hơn rất nhiều so với máy phát triển. Thiếu phông chữ gây ra việc dò tìm chậm và các chỉ số sai; cài đặt phông chữ, hoặc chỉ định FontFolders tới thư mục chứa chúng.

Chiến lược phía client

  • LargeDoc = true — chiến lược tải lười cho tài liệu rất lớn; các trang sẽ tải khi người dùng tiến gần.
  • AutoLoad = false (mặc định) — không render cho đến khi bạn thực sự gọi View(token).
  • ShowThumbs = false — bỏ qua việc tạo/đòi hỏi thumbnail cho bản xem trước một trang hoặc nhúng.
  • Bật FixedZoom tránh các thay đổi thu phóng tự do; khi bạn ánh xạ một C# ViewerConfig, điều chỉnh FixedZoomPercentMobile (mặc định C# 75) cho màn hình nhỏ.

Khởi động một lần, không phải mỗi yêu cầu

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance) thuộc về Application_Start, bên cạnh DoconutHost.Initialize — đăng ký các mã hoá mỗi yêu cầu là công việc lãng phí; bỏ qua hoàn toàn sẽ làm hỏng các tài liệu code-page legacy.

Tài liệu đầu tiên sau khi khởi động

Doconut tải các engine tài liệu lần đầu tiên khi một tài liệu được mở trong một ứng dụng — sau khi pool khởi động, sau mỗi lần tái tạo, và trong mỗi domain ứng dụng mới. Lần mở đầu tiên chậm hơn các lần sau, và phần mềm diệt virus thời gian thực có thể làm nó chậm hơn nhiều: các engine được tải từ bộ nhớ, và Microsoft Defender quét mã khi nó được tải. Việc loại trừ thư mục không giúp gì, vì không có tệp nào liên quan.

Được đo trên máy Windows Server 2022 4 lõi, mở một tài liệu Word hai trang:

Tài liệu đầu tiênMỗi tài liệu sau đó
Bảo vệ thời gian thực Defender bậtkhoảng 70 giây0.3–7.5 giây, tùy theo định dạng
Bảo vệ thời gian thực Defender tắt12–15 giây0.3–7.5 giây, tùy theo định dạng

Thanh toán một lần, trước khi người dùng của bạn làm:

  • Giữ tiến trình worker luôn hoạt động: đặt Start Mode của pool ứng dụng thành AlwaysRunning, và tăng hoặc tắt idle time-out, để đêm yên tĩnh không giải tải các engine.
  • Khởi động sưởi ấm: bật Application Initialization của IIS (preloadEnabled="true" trên site) và chỉ định initializationPage tới một trang của bạn mở một tài liệu nhỏ. Người dùng thực tế đầu tiên sau đó sẽ thấy các engine đã được tải sẵn.
  • Cung cấp thời gian cho yêu cầu đầu tiên: một health check của load balancer hoặc proxy upstream với thời gian chờ ngắn có thể từ bỏ khởi động lạnh mà lẽ ra sẽ thành công.

Việc thay đổi cài đặt phần mềm diệt virus trên máy chủ là quyết định của đội bảo mật của bạn; việc sưởi ấm ở trên hoạt động mà không cần nó.

Pool ứng dụng

Trên một máy chủ đơn, các phiên tài liệu và các trang được lưu trong bộ nhớ đệm tồn tại trong tiến trình worker. Mỗi lần tái tạo pool ứng dụng — theo lịch, một chỉnh sửa tới Web.config, hoặc idle time-out của pool (mặc định 20 phút trong IIS) — sẽ xóa chúng hết, và các trình xem mở sau đó sẽ hiển thị Document session not found. Please re-open document.

  • Điều chỉnh idle time-out và lịch tái tạo của pool phù hợp với thời gian người dùng thực tế đọc, hoặc sẵn sàng mở lại tài liệu sau khi tái tạo.
  • Chạy pool dưới dạng tiến trình 64-bit (để Enable 32-Bit Applications tắt). Các tài liệu lớn cần không gian địa chỉ mà tiến trình worker 32-bit không có.
  • Một web farm giữ các phiên trong một kho chung, vì vậy việc tái tạo trên một nút không làm mất chúng — xem Phiên & Bảo mật.

Danh sách kiểm tra tinh chỉnh

  1. Đặt mức ImageResolution thấp nhất mà UX của bạn chấp nhận.
  2. Giữ CachePages bật cho việc xem tương tác; tắt cho các kịch bản một lần hoặc đồng thời cao.
  3. Đóng các phiên một cách rõ ràng; rút ngắn TimeOut khi việc sử dụng có tính bùng nổ.
  4. Sử dụng LargeDoc + mặc định AutoLoad = false trên client cho tài liệu lớn.
  5. Chỉ dùng DefaultRender = false khi bạn cần một bản PDF có chứa văn bản.

Trang này có hữu ích không?