2012-05-17 11 views
11

Tò mò về số reputed performance gains trong xobotos, tôi đã kiểm tra cây nhị phân benchmark code.XobotOS: Tại sao điểm chuẩn cây nhị phân C# sử dụng cấu trúc?

Java phiên bản của binary tree node là:

private static class TreeNode 
{ 
    private TreeNode left, right; 
    private int item; 
} 

Các C# version là:

struct TreeNode 
{ 
    class Next 
    { 
    public TreeNode left, right; 
    } 

    private Next next; 
    private int item; 
} 

Tôi đang tự hỏi điều gì lợi ích của việc sử dụng một cấu trúc ở đây là, kể từ khi Next và con trỏ trước vẫn được đóng gói trong một lớp học.

Vâng, có một nút lá là các loại giá trị thuần túy vì chúng không cần con trỏ trái và phải. Trong một cây nhị phân điển hình, nơi một nửa các nút là lá, điều đó có nghĩa là giảm 50% số lượng đối tượng. Tuy nhiên, lợi nhuận hiệu suất được liệt kê dường như lớn hơn nhiều.

Câu hỏi: Còn nhiều điều nữa không?

Ngoài ra, vì tôi không nghĩ đến việc xác định các nút cây theo cách này trong C# (cảm ơn Xamarin!) Các cấu trúc dữ liệu khác có thể hưởng lợi từ việc sử dụng cấu trúc theo cách không rõ ràng? (Mặc dù đó là một chút off-topic và mở kết thúc.)

+1

Và mức tăng hiệu suất bạn đề cập là gì? – leppie

+1

Nhìn vào mã ngay bây giờ, rõ ràng là ai đó đã sao chép nó từ mã C mà không thực sự biết họ đang làm gì (hoặc ít nhất là làm theo cách rất ngớ ngẩn). – leppie

Trả lời

0

Nhóm này hai nút thành một phân bổ, lý tưởng giảm một nửa tổng số phân bổ.

IMO điều này làm cho việc so sánh khá vô nghĩa.

-1

Tôi không nghĩ rằng bằng cách sử dụng struct ở đây làm cho bất kỳ sự khác biệt ở tất cả. Đặc biệt là sau khi xem mã nguồn của TreeNode, trong đó các cá thể của TreeNode luôn được sao chép trong hàm khởi tạo và gọi hàm đệ quy bottomUpTree.

0

Cấu trúc có thể được cấp phát trên chồng thay vì đống (không phải trong mọi trường hợp), có nghĩa là chúng được phân bổ ngay sau khi chúng nằm ngoài phạm vi - Bộ thu gom rác không tham gia vào kịch bản đó. Điều đó có thể dẫn đến áp lực bộ nhớ nhỏ hơn và ít bộ sưu tập rác hơn. Ngoài ra, stack là (chủ yếu) khu vực tiếp giáp của bộ nhớ, do đó, truy cập vào nó có địa phương tốt hơn, có thể (một lần nữa, có thể) cải thiện tỷ lệ truy cập bộ nhớ cache trên mức CPU.

hướng dẫn của Microsoft trên choosing between classes and structures:

  • cấu trúc nên nhỏ (16 byte thường) và ngắn sống
  • họ nên được bất biến

Nếu những được đáp ứng, sau đó sử dụng một cấu trúc trên một lớp học sẽ cho kết quả đạt được.

1

Tôi vừa chạy qua mã kỳ lạ này và có cùng một câu hỏi. Nếu bạn thay đổi mã để khớp với phiên bản Java, nó sẽ chạy chậm hơn một chút. Tôi tin rằng hầu hết các 'struct TreeNode' sẽ nhận được đóng hộp và phân bổ anyway, ngoại trừ hàng dưới cùng. Tuy nhiên, mỗi nút kết quả trong 2 phân bổ: TreeNode đóng hộp và lớp Next. Các khoản tiết kiệm phân bổ nhanh chóng biến mất. IMO, đây không phải là việc sử dụng cấu trúc thích hợp.

+0

+1 để thực sự kiểm tra hiệu suất.Kể từ khi điểm chuẩn này được thực hiện cụ thể để thể hiện những lợi thế hiệu suất của Mono trên Java, tôi nghĩ rằng đây có lẽ là lý do. –