2010-08-17 21 views
6

Bản sao có thể xảy ra:
Pass by value vs Pass by reference performance C#.net
Giá trị truyền qua tham chiếu có cải thiện đáng kể tốc độ không?

Có ai đã thử nghiệm nếu truyền tham số bằng cách tham khảo là đáng kể nhanh hơn chỉ cần sao chép chúng?

Nhưng trọng tâm chính của câu hỏi là: Có bất kỳ nhược điểm nào khi sử dụng từ khóa ref ngược lại không sử dụng nó không?

+0

Hãy xem chủ đề này: http://stackoverflow.com/questions/408101/which-is-faster-byval-or-byref – MUG4N

+0

Đây là công cụ cũ nhưng cảm ơn –

Trả lời

14

Không, nó không cải thiện đáng kể tốc độ, hoặc bất cứ điều gì cả. Ngược lại, bằng cách sử dụng từ khóa ref, bạn đang thêm một mức độ gián tiếp khác mà chỉ có thể làm cho mã chậm hơn.

Thông số thường được chuyển theo giá trị, có nghĩa là chúng được sao chép. Đối với các giá trị đơn giản như int, nó chỉ đơn giản có nghĩa là một bản sao của giá trị được đặt trên ngăn xếp.

Đối với các loại tham chiếu như string, điều đó có nghĩa là bản sao tham chiếu được đặt trên ngăn xếp. Vì vậy, nó không có nghĩa là toàn bộ đối tượng được sao chép, nó chỉ là tham chiếu đến đối tượng được sao chép.

Bạn thường không nên sử dụng các từ khóa ref hoặc out, trừ khi có lý do đặc biệt để làm như vậy.

+1

Một nitpick nhỏ: Nếu bạn có * lớn * struct sau đó đi qua nó bằng cách ref có thể cải thiện hiệu suất rất nhẹ. Có nói rằng, nếu cấu trúc của bạn là quá lớn mà đi qua nó bởi val tác động đáng chú ý hiệu suất sau đó bạn nên nghiêm túc suy nghĩ về refactoring loại chính nó, và * không * về việc chuyển nó xung quanh bởi ref. – LukeH

+0

Tôi không hiểu, nếu chỉ tham chiếu được thông qua khi sử dụng đối số 'chuỗi', thì biến ban đầu đó sẽ không thay đổi khi thay đổi một tham số? Phải có một bản sao mới của chuỗi trong bộ nhớ (hoặc tôi sai?). Và nếu tôi đang xử lý (hoặc phân tích cú pháp, nhưng không thay đổi) chuỗi lớn thực sự, nó sẽ không được nhanh hơn để vượt qua nó bằng 'ref'? Cảm ơn bạn đã giải thích :). – Buksy

+0

@ Buksy: Tham số của loại tham chiếu (như chuỗi) được truyền theo giá trị nghĩa là một bản sao tham chiếu được chuyển. Nếu bạn thay đổi tham số, nó không ảnh hưởng đến tham chiếu ban đầu. Một yếu tố khác ở đây là các chuỗi là bất biến, vì vậy bạn không bao giờ có thể thay đổi chuỗi gốc. Nếu bạn gửi tham số chuỗi theo tham chiếu, bạn có thể thay đổi tham chiếu ban đầu để tham chiếu đến một đối tượng chuỗi khác.Vì các chuỗi là bất biến, chúng không cần phải được sao chép để đảm bảo rằng một phương thức không thể thay đổi chúng, điều này làm cho các chuỗi đi qua theo giá trị hiệu quả. – Guffa

3

Có nhiều loại giá trị và kiểu tham chiếu trong C#

Trong trường hợp của các loại tài liệu tham khảo, đi qua chúng mà không cần từ khóa ref nghĩa đi tham khảo. Tôi đã không thử nghiệm nó, nhưng tôi hy vọng rằng những người triển khai trình biên dịch và khung công tác .NET đã chuyển chúng nhanh nhất có thể. Tôi không thể tưởng tượng rằng việc chuyển các tham chiếu đến các tham chiếu đó nhanh hơn việc chuyển các tham chiếu ở vị trí đầu tiên. Nó không có ý nghĩa.

Trong trường hợp các loại giá trị, đó là một câu chuyện khác. Nếu cấu trúc là lớn, sao chép nó là tốn kém cho chắc chắn, và đi qua một tài liệu tham khảo nên được nhanh hơn. Nhưng các loại giá trị có nghĩa là các loại giá trị vì một lý do. Nếu bạn có một loại giá trị , bạn quan tâm đến hiệu quả của việc chuyển nó đến hàm, có thể bạn đã mắc sai lầm làm cho nó trở thành một loại giá trị.

Các vấn đề liên quan