Có sự khác biệt về hiệu suất giữa phương pháp thể hiện và phương pháp khuyến nông không?Phương pháp mở rộng hiệu suất so với Phương pháp thể hiện
Trả lời
Đừng quên phương pháp khuyến nông chỉ là lời gọi phương thức tĩnh được bọc trong cú pháp đường. Vì vậy, những gì bạn đang thực sự yêu cầu là
Có một sự khác biệt hiệu suất giữa các phương pháp tĩnh và dụ
Câu trả lời là có và có rất nhiều bài báo có sẵn về chủ đề này
Một số liên kết
Tôi đã hy vọng rằng bạn sẽ thêm một số trích dẫn cho những bài viết này vì tôi chưa tìm thấy bất kỳ bài viết nào. Có lẽ tôi đang đưa các thuật ngữ sai vào google. –
@Xin tôi quá :). Tôi đoán tôi đã không nhấn gửi lần cuối. Hãy thử googling cho "CLR phương pháp gọi hiệu suất" Hầu hết các bài viết có một cách tiếp cận chung nhưng sẽ thảo luận về ví dụ so với sự khác biệt tĩnh. – JaredPar
Cảm ơn - Có vẻ như đã đọc tốt ... Tôi sẽ quay lại ngay :) –
Tôi chắc chắn sẽ có bất kỳ sự khác biệt về hiệu suất bởi vì đó là tất cả các đường cú pháp. Trình biên dịch chỉ biên dịch nó giống như bất kỳ cuộc gọi phương thức nào khác, ngoại trừ nó là một phương thức tĩnh trên một lớp khác.
Một số chi tiết từ blog của tôi về đường cú pháp: http://colinmackay.co.uk/2007/06/18/method-extensions/
-1 Trong blog của bạn, bạn đang so sánh một phương pháp tĩnh với một phương thức tĩnh. Điều đó khác với phương pháp thể hiện ... –
Mục nhập blog đó được viết cách đây hơn hai năm và mục đích của nó không phải là để trả lời câu hỏi chính xác này.Sự bao gồm của tôi là mearly để chứng minh rằng các phương pháp mở rộng là cú pháp đường bằng cách hiển thị IL cơ bản và làm thế nào các phương pháp mở rộng làm việc nói chung. Nhưng, cảm ơn bạn đã bỏ phiếu! –
Có sự khác biệt về hiệu suất nhỏ, do số lượng đối số được chuyển vào phương thức. Ví dụ, hãy nhìn vào các lớp học sau:
public class MyClassInstance
{
public int MyProperty { get; set; }
public MyClassInstance(int prop)
{
MyProperty = prop;
}
public void IncrementInstance()
{
MyProperty++;
}
}
public static class MyClassStatic
{
public static void IncrementStatic(this MyClassInstance i)
{
i.MyProperty++;
}
}
chạy đoạn mã sau:
DateTime d = DateTime.Now;
MyClassInstance i = new MyClassInstance(0);
for (int x = 0; x < 10000000; x++)
{
i.IncrementInstance();
}
TimeSpan td = d - DateTime.Now;
DateTime e = DateTime.Now;
for (int x = 0; x < 10000000; x++)
{
i.IncrementStatic();
}
TimeSpan te = e - DateTime.Now;
td = 0,2499 giây
te = 0,2655 giây
do thực tế rằng phương thức cá thể không phải truyền bất kỳ đối số nào.
heres một chút ngày, nhưng tốt bài viết về hiệu suất
Điều gì sẽ xảy ra với tham chiếu "này" trong một cuộc gọi phương thức thể hiện? Nó đi đâu? Làm thế nào để có được thông qua? Phương pháp cần lấy nó từ đâu đó? –
về cơ bản cả IncrementInstance và IncrementStatic đều gọi phương thức Set cho thuộc tính MyProperty. Phương thức thể hiện đề cập trực tiếp đến bộ nhớ cá thể, trong khi phương thức tĩnh đề cập đến cá thể được truyền vào như một đối số. –
Thật kỳ lạ, tôi lấy mã của bạn và chạy nó trên máy tính của tôi. Khi tôi sử dụng cùng một số lần lặp lại khi các con số nhảy qua nhau. Đôi khi các phương pháp ví dụ giành chiến thắng, đôi khi các phương pháp mở rộng. Tôi hình bộ đếm thời gian là không đủ tốt, vì vậy tôi thiết lập các iterations đến hơn 2billion (int.MaxValue) và bây giờ tôi nhận được kết quả khá nhất quán. Việc lặp lại bằng cách sử dụng phương thức thể hiện mất 46 nano giây để hoàn thành và một phép lặp sử dụng phương thức mở rộng mất 45 nano giây để hoàn thành. Tôi không nghĩ rằng tôi sẽ tối ưu hóa bất cứ thứ gì theo cách này hay cách khác dựa trên một nano giây khác biệt. –
Nó không thực hiện bất kỳ sự khác biệt đáng kể. Xem this article.
Tôi đã xác minh kết quả của thử nghiệm và đã thực hiện một thử nghiệm khác trong đó biến thể tĩnh có thông số với loại Sample
. Tất cả trong số họ mất 11495ms (+/- 4ms) trên hệ thống của tôi cho 2,1 tỷ cuộc gọi. Như bài báo nói, bạn không nên lo lắng về điều này.
Hầu hết các ví dụ và kiểm tra ở đây đều không hợp lệ vì chúng cho phép phương thức nội tuyến. Đặc biệt dễ dàng trên trình biên dịch nếu phương thức trống;)
(thú vị khi thấy rằng thử nghiệm chậm hơn trên hệ thống của tôi so với bài viết .. nó không chính xác chậm, nhưng có thể là do hệ điều hành 64 bit)
Liên kết đó không hoạt động nữa ... – takrl
Tôi đang kiểm tra với tác giả nếu có nơi nào khác mà anh ấy đưa nó trực tuyến. Trong thời gian chờ đợi, bạn có thể đọc nó trên http://web.archive.org/web/20090624234442/http://gregbeech.com/blogs/tech/archive/2007/01/11/static-vs-instance-method -performance.aspx – Thorarin
Phải, cảm ơn, tôi đã kiểm tra blog hiện tại của anh ấy nhưng nó không còn ở đó nữa. – takrl
- 1. Phương pháp mở rộng so với Helper Lớp
- 2. Phương pháp mở rộng so với phương pháp thông thường - Ý tưởng thực hành tốt nhất
- 3. Phương pháp mở rộng so với thừa kế
- 4. Phương pháp mở rộng ảo?
- 5. Mocking Phương pháp mở rộng với Moq
- 6. Phương pháp mở rộng cho nullable enum
- 7. Phương pháp lớp Ruby so với phương pháp trong Eigenclasses
- 8. FormatProvider so với phương pháp mở rộng so với lớp mới
- 9. Phương pháp mở rộng: Vấn đề về hiệu suất khi sử dụng quá nhiều?
- 10. Phương pháp mở rộng bằng Python
- 11. Phương pháp tĩnh so với các phương thức thể hiện trong C#
- 12. So sánh: phương pháp giao diện so với phương pháp ảo so với phương pháp trừu tượng
- 13. LINQ và phương pháp mở rộng Đếm
- 14. Phương pháp lõi jQuery so với phương pháp tiện ích
- 15. Độ phân giải phương pháp mở rộng
- 16. Phương pháp mở rộng cho Enumerable.Intersperse?
- 17. Phương pháp mở rộng chuỗi trong C#
- 18. Phương pháp mở rộng liệt kê
- 19. Phương pháp mở rộng trên lớp tĩnh?
- 20. Ghi đè (hoặc đổ bóng) một phương pháp với phương pháp mở rộng?
- 21. javascript prototype mở rộng phương pháp
- 22. Cách tạo phương pháp mở rộng chung?
- 23. Phương pháp mở rộng TryParse chung
- 24. phương pháp mở rộng để mở rộng lớp tĩnh
- 25. PHP - mở rộng phương pháp như mở rộng một lớp
- 26. Mang lại phương pháp DbContext.Detach() với một phương pháp mở rộng (EF5)
- 27. Tổ chức các phương pháp mở rộng
- 28. Foreach với Phương pháp mở rộng trên IEnumerable
- 29. Có thể có phương pháp mở rộng riêng tư không?
- 30. phương pháp mở rộng với nhiều loại generic cụ
Viết mã theo cả hai cách. Lấy ra một đồng hồ bấm giờ. Sau đó, bạn sẽ biết. –