2010-03-17 45 views
10

Chi phí hiệu năng tương đối của việc gọi phương thức qua mã nội tuyến là bao nhiêu?Gọi phương thức đắt bao nhiêu .net

+1

Bạn đang phát triển điều gì khiến bạn lo lắng về cuộc gọi phương thức tốn thời gian? –

+0

Kho lưu trữ dữ liệu trong bộ nhớ lớn – Andrew

+1

Tương đối? Có lẽ là một bậc độ lớn. Nhưng, đừng để điều đó đánh lừa bạn - (1/2.000.000.000)^10 vẫn là một số * thực sự * nhỏ. –

Trả lời

18

Điều đó sẽ phụ thuộc vào nhiều yếu tố

  • Cho dù inlines JIT nó cho bạn
  • Cho dù đó là ảo
  • Số lượng và kích thước của các thông số
  • Cho dù đó là một phương pháp dụ (với ngầm kiểm tra vô hiệu)
  • Cho dù có giá trị trả lại (và kích thước của nó nếu có)

Rất, rất không thể là nút cổ chai của bạn. Như mọi khi, hãy viết mã dễ đọc nhất mà bạn có thể đầu tiên, rồi chuẩn nó để xem nó có hoạt động tốt hay không. Nếu không, hãy sử dụng trình thu thập thông tin để tìm các điểm nóng mà có thể có giá trị tối ưu hóa vi mô.

+0

trong trường hợp C# 2 là vấn đề. CSC phát ra 'callvirt' cho mọi phương thức gọi – Andrey

+0

@Andrey: Sử dụng' callvirt' trên các phương thức không phải ảo không ngăn JIT nội tuyến phương thức đó. – Steven

+0

@Steven tôi đã không nói nó ngăn cản nội tuyến. Tôi chỉ nói rằng ảo hay không không ảnh hưởng đến hướng dẫn phát ra – Andrey

3

Tương tự như trong C++. Về cơ bản một cuộc gọi và trả lại, cộng với thiết lập các tham số. Lưu ý, mặc dù, JIT có thể gọi phương thức nội tuyến - vì vậy nó có thể không đắt tiền trong một ngữ cảnh cụ thể như bạn nghĩ.

1

Không đáng kể. Mọi cuộc gọi trong .net, ít nhất là cho C# là cuộc gọi ảo ngay cả khi phương thức không được đánh dấu là ảo, hãy xem xét nó.

+0

Điều này không có nghĩa là đó là một cuộc gọi ảo. 'callvirt' đảm bảo JIT thêm một kiểm tra null trước khi gọi bất kỳ phương thức cá thể nào. Tuy nhiên, JIT có thể chọn nội tuyến các phương thức này khi nó thấy chúng không phải là ảo. – Steven

1

Chi phí hiệu suất là không quan trọng vì không liên quan so với việc làm cho mã dễ đọc và mục đích của nó rõ ràng.

+2

Nói chung, bạn có thể tối ưu hóa cho một tập hợp con {tốc độ, bộ nhớ, độ tin cậy, hiệu suất lập trình viên}. Tôi đã thấy rằng nếu bạn tối ưu hóa cho hiệu quả lập trình đầu tiên, những người khác là khá dễ dàng để làm sau. Bất kỳ thứ tự nào khác cũng không hoạt động. –

+0

Không thể đồng ý hơn. Nếu mục đích của mã dễ nắm bắt bởi các lập trình viên khác, thì hiệu quả hoạt động có thể được tìm thấy sau đó với chi phí tài nguyên thấp hơn. – Thomas

6

Có một số cost được kết hợp với các cuộc gọi phương thức;

Các đối số cần được đẩy lên ngăn xếp hoặc được lưu trữ trong sổ đăng ký, phương thức prolog và epilog cần được thực thi và cứ như vậy. Bạn có thể tránh chi phí của các cuộc gọi này bằng cách In-lining.

Nhưng, JIT sử dụng một số phương pháp chẩn đoán để quyết định xem phương pháp có nên được xếp hàng hay không. Các yếu tố sau ảnh hưởng đến JIT, không phải là phương pháp In-line.

  • Phương pháp đó là lớn hơn 32 byte của IL
  • chức năng ảo
  • Phương pháp đó có dòng chảy phức tạp kiểm soát phương pháp
  • chứa khối ngoại lệ xử lý
  • Nếu bất kỳ phương pháp của các đối số chính thức là các cấu trúc

Tham chiếu: Method Inlining

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