Tôi đã poking xung quanh trong XNA và thấy rằng lớp Vector3
trong nó đã được sử dụng lĩnh vực công cộng thay vì tài sản. Tôi đã thử một điểm chuẩn nhanh chóng và thấy rằng, cho một sự khác biệt là khá ấn tượng (thêm hai Vectors với nhau một 100 triệu lần mất 2.0s với tài sản và 1,4 với các lĩnh vực). Đối với một loại tham chiếu, sự khác biệt dường như không lớn nhưng nó ở đó.Tại sao các trường công khai nhanh hơn các thuộc tính?
Vậy tại sao vậy? Tôi biết rằng thuộc tính được biên dịch thành các phương thức get_X
và set_X
, sẽ phải trả phí gọi phương thức. Tuy nhiên, không phải những getters/setters đơn giản này luôn luôn được JIT xếp hàng? Tôi biết bạn không thể đảm bảo những gì JIT quyết định làm, nhưng chắc chắn điều này là khá cao trong danh sách xác suất? Còn gì khác có thể tách một lĩnh vực công khai khỏi một tài sản ở cấp độ máy?
Và một điều tôi đã tự hỏi: làm thế nào là một thuộc tính tự động thực hiện (public int Foo { get; set; }
) 'tốt hơn' OO-thiết kế hơn một lĩnh vực công cộng? Hoặc tốt hơn đã nói: hai số này là khác nhau như thế nào? Tôi biết rằng làm cho nó một tài sản dễ dàng hơn với sự phản ánh, nhưng bất cứ điều gì khác? Tôi đặt cược câu trả lời cho cả hai câu hỏi là điều tương tự.
BTW: Tôi đang sử dụng .NET 3.5 SP1 mà tôi tin rằng các vấn đề cố định trong đó phương pháp có cấu trúc (hoặc phương pháp của cấu trúc, tôi không chắc) không được xếp hàng. Tôi nghĩ rằng tôi đang sử dụng nó ít nhất, nó chắc chắn được cài đặt nhưng sau đó một lần nữa, tôi đang sử dụng Vista 64-bit với SP1 mà nên có DX10.1 ngoại trừ tôi không có DX10.1 ..
Ngoài ra: yeah, tôi đã chạy một xây dựng phát hành :)
EDIT: tôi đánh giá cao câu trả lời chàng trai nhanh chóng, nhưng tôi chỉ ra rằng tôi làm biết rằng một truy cập tài sản là một phương pháp gọi, nhưng mà tôi don' t biết lý do tại sao, có lẽ, trong lót phương pháp là chậm hơn so với một truy cập trực tiếp lĩnh vực.
EDIT 2: Vì vậy, tôi đã tạo ra một struct
rằng sử dụng rõ ràng GetX() phương pháp (o làm thế nào tôi không bỏ lỡ ngày Java của tôi ở tất cả) và thực hiện như nhau cho dù tôi vô hiệu hóa trong-lót trên đó (thông qua [MethodImplAttribute(MethodImplOptions.NoInlining)]
) hay không, vì vậy kết luận: phương pháp không tĩnh dường như không bao giờ được gạch chân, ngay cả trên cấu trúc.
Tôi nghĩ rằng có những ngoại lệ, trong đó JIT có thể chọn phương thức ảo gọi đi. Tại sao điều này không thể xảy ra trên các cấu trúc mà không biết thừa kế và do đó một cuộc gọi phương thức chỉ có thể trỏ đến một phương thức có thể, đúng không? Hoặc là bởi vì bạn có thể thực hiện một giao diện trên nó?
Đây là loại một sự xấu hổ, vì nó sẽ thực sự làm cho tôi suy nghĩ về việc sử dụng tài sản trên hiệu suất thứ quan trọng, tuy nhiên sử dụng các lĩnh vực khiến tôi cảm thấy bẩn và tôi cũng có thể viết những gì tôi đang làm trong C.
EDIT 3: Tôi đã tìm thấy this đăng bài về cùng một chủ đề chính xác. Kết luận cuối cùng của ông là cuộc gọi tài sản đã được tối ưu hóa. Tôi cũng có thể thề rằng tôi đã đọc nhiều lần rằng các thuộc tính getter/setter đơn giản sẽ được xếp hàng, mặc dù là callvirt
trong IL. Vậy tôi có bị điên không?
EDIT 4: Reed Copsey gửi câu trả lời trong một chú thích bên dưới:
Re: Edit3 - xem bình luận cập nhật của tôi: Tôi tin rằng đây là x86 JIT vs vấn đề x64 JIT. JIT trong x64 không phải là trưởng thành. Tôi hy vọng MS sẽ cải thiện điều này một cách nhanh chóng khi có thêm hệ thống 64 bit trực tuyến mỗi ngày. - Reed Copsey
Và câu trả lời của tôi cho câu trả lời của mình:
Cảm ơn, đây là câu trả lời! Tôi đã cố gắng xây dựng một x86 và tất cả các phương thức đều nhanh và nhanh hơn nhiều so với x64. Điều này thực sự rất gây sốc cho tôi, tôi không biết mình đang sống trong thời kỳ đồ đá trên hệ điều hành 64-bit của mình .. Tôi sẽ đưa nhận xét của bạn vào câu trả lời để nó nổi bật hơn. - JulianR
Cảm ơn mọi người!
Câu hỏi: Điều gì sẽ xảy ra nếu trường công khai nhưng cũng có thuộc tính. Vậy nó có được gạch chân không? – Quibblesome
Có vẻ như không, không. – JulianR
Re: Edit3 - xem bình luận cập nhật của tôi: Tôi tin rằng đây là vấn đề JIT x86 JIT vs x64 JIT. JIT trong x64 không phải là trưởng thành. Tôi hy vọng MS sẽ cải thiện điều này một cách nhanh chóng khi có thêm hệ thống 64 bit trực tuyến mỗi ngày. –