9

Loại mô hình tối ưu nào có thể được sử dụng để cải thiện hiệu suất của bộ thu gom rác?Làm cách nào để cải thiện hiệu suất thu gom rác?

Lý do tôi hỏi là tôi làm rất nhiều phần mềm được nhúng bằng Compact Framework. Trên các thiết bị chậm, việc thu gom rác có thể trở thành một vấn đề, và tôi muốn giảm thời gian người thu gom rác thải vào, và khi nào, tôi muốn nó kết thúc nhanh hơn. Tôi cũng có thể thấy rằng làm việc với bộ thu gom rác thay vì chống lại nó có thể giúp cải thiện bất kỳ ứng dụng .NET hoặc Java nào, đặc biệt là các ứng dụng web nặng nề.

Dưới đây là một số suy nghĩ của tôi, nhưng tôi chưa thực hiện bất kỳ điểm chuẩn nào.

  • tái sử dụng các lớp học tạm thời/mảng (giữ xuống đếm phân bổ)
  • giữ số lượng đối tượng sống ở mức tối thiểu (bộ sưu tập nhanh hơn)
  • cố gắng sử dụng cấu trúc thay vì lớp
+0

Tôi khuyên bạn nên thay đổi tiêu đề thành "... cải thiện .NET frameworok nhỏ gọn ..." để các kết quả tìm kiếm ít gây nhầm lẫn hơn. – cdiggins

Trả lời

12

Điều quan trọng là hiểu cách CF GC hoạt động để phân bổ. Đó là GC đơn giản và không quét, với các thuật toán cụ thể cho những gì sẽ kích hoạt một GC, và điều gì sẽ gây ra sự nén chặt và/hoặc làm nổi bật sau khi thu thập. Có hầu như không có gì bạn có thể làm ở cấp ứng dụng để kiểm soát GC (phương pháp duy nhất có sẵn là Thu thập, và nó sử dụng là khá hạn chế, vì bạn không thể ép buộc nén).

Tái sử dụng đối tượng là một khởi đầu tốt, nhưng chỉ đơn giản là giữ số lượng đối tượng thấp có lẽ là một trong những công cụ tốt nhất, vì tất cả các gốc đều phải được thực hiện cho bất kỳ thao tác thu thập nào. Giữ cho đi bộ ngắn là một ý tưởng tốt. Nếu nén là giết chết bạn, sau đó ngăn chặn phân đoạn phân đoạn sẽ giúp đỡ. Đối tượng> 64k có thể hữu ích trong lĩnh vực này khi chúng có phân đoạn riêng và được xử lý khác với các đối tượng nhỏ hơn.

Để thực sự hiểu cách hoạt động của CF GC, tôi khuyên bạn nên xem MSDN Webcast on CF memory management.

2

Một thực tế quan trọng là giữ cho tuổi thọ của đối tượng của bạn càng ngắn càng tốt.

+1

Không nhất thiết. Rất nhiều vật thể nhỏ, sống ngắn sẽ khiến GC bị va chạm nặng hơn chỉ là một vài vật thể lớn, sống lâu và thực sự sẽ làm trầm trọng thêm vấn đề của anh ta. Đây là * không * một máy tính để bàn với bộ nhớ máy tính và tài nguyên bộ vi xử lý – ctacke

+0

Tôi dường như nhớ lời khuyên từ MS là để giữ cho các đối tượng càng ngắn càng tốt. Các đối tượng tồn tại thế hệ 0 có nhiều vấn đề hơn. –

+0

Tôi tìm thấy một tham chiếu đến một bài viết MSDN về điều này. Dường như về sự chậm lại x10 trên mỗi thế hệ bộ nhớ. Bài viết có tại: http://msdn.microsoft.com/en-us/magazine/dd882521.aspx#id0400035 –

2

Vấn đề về cấu trúc so với lớp học là một vấn đề phức tạp ... bạn có thể dễ dàng kết thúc bằng cách sử dụng một không gian ngăn xếp nhiều hơn chẳng hạn. Và bạn chắc chắn không muốn cấu trúc có thể thay đổi được. Nhưng các điểm khác có vẻ hợp lý, miễn là bạn không uốn thiết kế ra khỏi hình dạng để chứa nó.

[biên tập] Một hình ảnh phổ biến khác là chuỗi nối; nếu bạn đang làm nối trong một vòng lặp, hãy sử dụng StringBuilder, nó sẽ loại bỏ một số của các chuỗi trung gian. Nó có thể là GC đang bận rộn thu thập tất cả các vesions bị bỏ rơi của dây của bạn?

2

Tùy chọn khác sẽ là thu thập rác theo cách thủ công trong thời gian không cao điểm trong ứng dụng của bạn bằng cách sử dụng GC.Collect() (giả sử điều này có sẵn trong CF). Điều này có thể làm giảm các đối tượng cần thiết để dọn dẹp sau này trong ứng dụng của bạn.

0

Tôi đã nghe một số .NET Rocks hiển thị trên Rotor 2.0. Nếu bạn đang thực sự hardcore, bạn có thể tải về Rotor, tinh chỉnh nguồn, và sử dụng bộ sưu tập rác sửa đổi của riêng bạn.

Trong mọi trường hợp, podcast đó có một số thông tin tuyệt vời về GC. Tôi rất khuyên bạn nên nghe nó.

3

Khía cạnh quan trọng nhất là giảm thiểu tỷ lệ phân bổ. Bất cứ khi nào một đối tượng được phân bổ, nó cần GC sau này. Bây giờ tất nhiên, nếu đối tượng là nhỏ hoặc shortlived nó sẽ được đóng đinh trong thế hệ trẻ (miễn là GC là thế hệ). Các vật thể lớn có xu hướng đi thẳng vào đấu trường. Nhưng tránh phải thu thập ở tất cả thậm chí còn tốt hơn.

Ngoài ra, nếu bạn có thể ném mọi thứ lên ngăn xếp, bạn sẽ tận hưởng ít áp lực hơn đối với GC. Bạn có thể thử đùa giỡn với các tùy chọn GC, nhưng tôi nghĩ bạn sẽ được giúp đỡ tốt hơn nhiều với một hồ sơ phân bổ trong tay, vì vậy bạn có thể tìm thấy những điểm mà làm cho các vấn đề.

Điều bạn nên cẩn thận là trọng lượng của các thư viện và khung chuẩn. Bạn quấn một vài đối tượng và nó sẽ lấp đầy khá nhanh chóng. Hãy nhớ rằng, bất cứ khi nào một cái gì đó đi trên GC-heap, nó thường sử dụng một chút không gian hơn cho GC-sổ sách kế toán.Vì vậy, 1000 con trỏ của bạn được phân bổ riêng lẻ là lớn hơn nhiều so với mảng/vectơ của cùng một con trỏ vì sau này có thể chia sẻ sổ sách kế toán GC. Mặt khác, sau này có thể sẽ còn sống lâu hơn nữa.

+2

CF không phải là thế hệ - nó hoàn toàn là đánh dấu và quét. – ctacke