2009-07-28 39 views

Trả lời

17

Đừ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

+0

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. –

+0

@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

+0

Cảm ơn - Có vẻ như đã đọc tốt ... Tôi sẽ quay lại ngay :) –

5

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/

+0

-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 ... –

+0

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! –

0

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

+1

Đ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 đó? –

+0

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ố. –

+1

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. –

3

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)

+0

Liên kết đó không hoạt động nữa ... – takrl

+0

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

+0

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

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