Trình biên dịch JIT tạo mã trường hợp đặc biệt để sao chép các cấu trúc nhỏ hơn một ngưỡng nhất định và cấu trúc mục đích chung chậm hơn một chút cho các cấu trúc lớn hơn. Tôi sẽ phỏng đoán rằng khi lời khuyên đó được viết, ngưỡng là 16 byte, nhưng trong khung 32-bit ngày nay, nó có vẻ là 24 byte; nó có thể lớn hơn đối với mã 64 bit.
Điều đó đã được nói, chi phí tạo bất kỳ đối tượng lớp kích thước nào lớn hơn đáng kể so với chi phí sao chép cấu trúc chứa cùng một dữ liệu. Nếu mã tạo ra một đối tượng lớp có giá trị 32 byte và sau đó truyền hoặc sao chép tham chiếu đến đối tượng đó 1.000 lần, thì việc tiết kiệm thời gian từ việc sao chép 1.000 tham chiếu đối tượng thay vì phải sao chép 1.000 cấu trúc 32 byte có khả năng lớn hơn chi phí của tạo đối tượng lớp. Tuy nhiên, nếu thể hiện đối tượng sẽ bị hủy bỏ sau khi tham chiếu đã được sao chép chỉ hai lần, chi phí tạo đối tượng có thể vượt quá một lề lớn chi phí sao chép cấu trúc 32 byte hai lần.
Cũng lưu ý rằng có thể trong nhiều trường hợp để tránh truyền xung quanh các cấu trúc theo giá trị hoặc sao chép dự phòng chúng, nếu một nỗ lực để làm như vậy. Việc chuyển bất kỳ kích thước nào của cấu trúc dưới dạng tham số ref
thành một phương thức, ví dụ, chỉ yêu cầu chuyển một địa chỉ một máy (4 hoặc 8 byte). Bởi vì .net thiếu bất kỳ loại khái niệm const ref
, chỉ các trường hoặc biến có thể ghi được có thể được chuyển theo cách đó và các bộ sưu tập được tích hợp vào .net - khác với System.Array
- không cung cấp phương tiện để truy cập các thành viên theo số ref
. Tuy nhiên, nếu một người sẵn sàng sử dụng các mảng hoặc các bộ sưu tập tùy chỉnh, thậm chí các cấu trúc lớn (100 byte hoặc nhiều hơn) có thể được xử lý rất hiệu quả. Trong nhiều trường hợp, lợi thế hiệu suất của việc sử dụng một cấu trúc hơn là một lớp không thay đổi có thể phát triển với kích thước của dữ liệu được đóng gói.
Điều gì khiến bạn tin rằng việc giữ dữ liệu trên ngăn xếp có hiệu quả hơn? Stack so với heap là một chi tiết thực hiện trong.NET và các nhà phát triển không nên quan tâm (xem http://stackoverflow.com/questions/477101/heap-versus-stack-allocation-implications-net/477333#477333) –
Hỏi về hiệu quả mà không nói số liệu bạn đang sử dụng là một chút mơ hồ. Nó giống như yêu cầu chiếc xe hiệu quả nhất - mà không đề cập đến việc bạn có muốn tiết kiệm tiền đi lại hay cố gắng vận chuyển 30 tấn hàng hóa hay không. –
Divo bạn sai về nguyên tắc. Tôi nên quan tâm điều gì để làm cho ứng dụng của tôi tốt hơn bên ngoài chủ đề này. Cảm ơn –