2009-10-15 23 views
9

Khi nào, nếu bao giờ, sẽ nhanh hơn khi chuyển đối số làm đối số cho phương thức tĩnh thay vì có phương thức không tĩnh và truy cập cùng các giá trị thông qua các thành viên cá thể. Giả sử phương thức truy cập các thành viên này theo kiểu chỉ đọc.Có thể làm cho một phương pháp tĩnh cải thiện hiệu suất, và trong hoàn cảnh nào?

Tất cả những thứ khác bằng nhau, gọi phương thức tĩnh là slightly faster hơn gọi phương thức thể hiện.

Tất cả những thứ khác bằng nhau, gọi phương thức không có đối số nhanh hơn một chút so với cách gọi một đối số.

xem xét:

private Thing _thing; 

void DoTheThing() 
{ 
    _thing.DoIt(); 
} 

so với mã tương đương này:

private Thing _thing; 

// caller's responsibility to pass "_thing" 
static void DoTheThing(Thing thing) 
{ 
    thing.DoIt(); 
} 

Tôi không thể nghĩ ra một tình huống thực tế mà loại này tối ưu hóa thực sự sẽ thêm bất kỳ giá trị, mà là một thử nghiệm suy nghĩ (cho những người thích thảo luận về loại điều này), có thực sự là một lợi ích, và nếu như vậy thì có bao nhiêu đối số (của những loại vv) tip sự cân bằng theo cách khác?

Có yếu tố nào khác phát sinh khi xem xét điều này không? Phương pháp tĩnh truy cập _thing dưới dạng biến địa phương thay vì một trường, chẳng hạn.

+2

+1 Câu hỏi hay. Khi bạn chạy mã phân tích trên mã của bạn trong VS bạn nhận được lỗi CA1822 nếu phương pháp của bạn trong lớp học của bạn có thể được đánh dấu là tĩnh. Nó luôn làm tôi khó chịu, và tôi thực sự tự hỏi liệu có bất kỳ lợi ích nào không. – BFree

+0

@BFree - nếu bạn theo liên kết tôi đưa vào câu hỏi, bạn có thể thấy rằng việc gọi phương thức tĩnh nhanh hơn một chút. Trong IL, người gọi không phải đẩy một tham chiếu đến đích vào ngăn xếp (JIT có thể hủy bỏ điều này), và EE không phải kiểm tra mục tiêu này về tính vô hiệu. –

+2

Có, có hiệu suất đạt được, nhưng bạn không có khả năng nhìn thấy nó cho đến khi bạn đang gọi phương thức trong một vòng lặp cho hàng trăm ngàn lần. Tối ưu hóa sớm. –

Trả lời

6

Có một có thể lợi ích hiệu suất tôi có thể thnk (đối với phương pháp không ảo): phương pháp tĩnh không cần kiểm tra tham chiếu cho giá trị rỗng trước (để ném NullReferenceException nếu thích hợp).

Tôi không nghĩ rằng điều này hiện đang mang lại bất kỳ lợi thế nào, nhưng đó là điều có thể xảy ra. Tôi không chắc chắn nó sẽ áp dụng trong ví dụ cụ thể của bạn, mặc dù - và thật khó để xem nó sẽ áp dụng như thế nào trong bất kỳ trường hợp nào bạn thực sự muốn sử dụng giá trị.

0

Trong trường hợp của bạn (tôi giả sử mẫu mã sẽ nằm trong lớp Thing) tĩnh và không tĩnh sẽ không có sự khác biệt về tốc độ nào cả. Đây là từ liên kết BẠN:

  • 0,2 0,2 ​​inlined tĩnh gọi
  • 0,2 0,2 ​​inlined này gọi inst

Vì vậy, không có ý nghĩa gì cả trong việc đưa ra nó tĩnh cho một tăng tốc độ.

Cũng tính đến các giá trị được cung cấp trong trang được liên kết của bạn đến từ .Net 1.1 và cách cũ.

+0

Một điểm thú vị, mặc dù nó chỉ áp dụng khi các phương thức được inlined. Ví dụ tôi đã sử dụng có lẽ sẽ được inline nhưng các phương thức lớn hơn (hoặc những kiểu có giá trị làm đối số, IIRC) sẽ không được gạch chân trong trường hợp cuộc gọi tĩnh tốn 6.1ns và cuộc gọi cá thể tốn 6.8ns. –

+0

Theo liên kết bạn có cuộc gọi cá thể sẽ là 6.2ns thay vì 6.1ns cho tĩnh. Ngoài ra không có số tôi thực sự giả định rằng điều này sẽ được bù đắp bởi tham số bổ sung có nghĩa là phiên bản tĩnh có lẽ thậm chí còn chậm hơn một chút. – Foxfire

+0

Chỉ cần làm rõ: Đó là một trường hợp này gọi là – Foxfire

0

Tôi không chắc chắn về thống kê hiệu suất giữa các phương pháp tĩnh và phương pháp thể hiện.

Nhưng tôi tin rằng quyết định nên được thực hiện cho dù bạn làm cho nó như là một phương pháp tĩnh hoặc phương pháp dụ trên cơ sở thiết kế đối tượng. Nếu bằng cách gọi phương thức của bạn, trạng thái của đối tượng không bị thay đổi, thì bạn nên đặt phương thức đó làm phương thức tĩnh (phương thức cho kiểu này, không phải cho một cá thể perticular của kiểu).

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