2008-11-20 41 views
16

Việc sử dụng các đại biểu có làm chậm chương trình của tôi không?Việc sử dụng các đại biểu có làm chậm chương trình .NET của tôi không?

Tôi đã tránh chúng vì tôi thực sự không có đầu mối nếu chúng làm cho chương trình của tôi chậm hơn. Tôi biết nếu tôi gây ra một (bắt) ngoại lệ, sử dụng khá nhiều năng lượng CPU nhưng tôi không biết về Đại biểu và Sự kiện và những gì NET không cho họ.

+0

tại sao bạn chưa chấp nhận câu trả lời ngay cả đối với câu hỏi này? – nawfal

Trả lời

16

Đại biểu rất, rất nhanh. Không hoàn toàn nhanh như gọi phương thức trực tiếp, nhưng không xa lắm. Cơ hội của họ trở thành một nút cổ chai là rất nhỏ.

(Tương tự trường hợp ngoại lệ, khi được sử dụng đúng cách, rarely actually cause a performance issue.)

sẽ sử dụng các đại biểu làm cho mã của bạn đơn giản hơn, dễ đọc hơn, và mạnh mẽ hơn? Nếu có, hãy sử dụng chúng. Đo lường hiệu suất của bạn một cách cẩn thận và theo dõi nó. Di chuyển ra khỏi khả năng đọc vì lợi ích của hiệu suất chỉ khi dữ liệu được rõ ràng. Tôi chắc rằng có một số đồ thị xung quanh hiển thị tốc độ của đại biểu so với giao diện so với các cuộc gọi phương thức không ảo vv - Tôi không biết chúng ở đâu, nhưng bạn luôn có thể chạy thử nghiệm nếu bạn thực sự lo lắng .

+3

Jon - Tôi vừa mới khởi động phản xạ và xem xét việc thực thi mặc định MulticastDelegate.CombineImpl, và hơi sợ hãi về độ dài của phương thức, và để thấy rằng nó tái tạo mảng một cách trực tiếp. Tôi đã nghĩ rằng các đại biểu sẽ được kết hợp bằng cách sử dụng danh sách liên kết. Bạn đã chạy bất kỳ bài kiểm tra nào để xem họ thực sự như thế nào? – Mark

+2

@Mark: Không phải cho việc kết hợp và xóa bỏ, nhưng đó là điều hiếm khi xảy ra trong kinh nghiệm của tôi. Thông thường, các đại biểu giống nhau được gọi nhiều, nhiều lần (ví dụ: cho LINQ), do đó tốc độ truy vấn quan trọng hơn. –

9

Chỉ cần thêm một phần nhỏ vào bài viết của Jon: khi được sử dụng theo cách C# thông thường (tức là thông qua lambdas/phương thức ẩn danh/xử lý sự kiện/v.v.), thì chắc chắn rất nhanh - nhưng lưu ý rằng việc sử dụng quan trọng khác của đại biểu có thể là để thực thi mã động (hoặc các phương thức được xây dựng trong thời gian chạy hoặc các phương thức hiện có thông qua sự phản chiếu và Delegate.CreateDelegate). Khi được sử dụng theo cách thứ hai này, các đại biểu cung cấp tốc độ rất đáng kể cải tiến (so với phản ánh Gọi vv).

Vì vậy, đừng ngại ngần khi sử dụng các đại biểu. Và đặc biệt, nếu nghi ngờ - đo lường nó cho mã thực tế: nó là vô nghĩa cho dù phải mất 1 hoặc 100 micro-chồn *, nếu điều này vẫn chỉ chiếm 0,01% thời gian thực hiện tổng thể của bạn.

* = chỉ một số khoảng thời gian tùy ý ...

+3

Từ bây giờ tôi nghĩ tôi sẽ đưa ra bất kỳ kết quả hoạt động nào trong pico-fortnights. Không ai có thể tuyên bố rằng họ đang thiếu thông tin, nhưng nó nhấn mạnh tính chất * tương đối * của hầu hết các so sánh hiệu suất. Thời gian cho một phương pháp mở rộng trên TimeSpan ... –

+1

Pico-hai tuần dài hơn hoặc ngắn hơn một vi chồn? Tìm hiểu tâm trí muốn biết :) –

+0

Hah, pico-hai tuần! Đẹp một Jon :) –

6

Hiệu suất có thể là một chủ đề nhạy cảm khi nói đến lập trình. Ví dụ, một số người tuyệt đối kiên quyết rằng quyền anh là gốc rễ của mọi điều xấu xa. Những người khác nghĩ rằng chuỗi concats là một hit hiệu suất lớn.

Trong thực tế, mọi thứ đều tương đối và tất cả đều tóm tắt theo ngữ cảnh bạn đang nói đến. Nếu bạn đang lập trình trên thiết bị di động, thì bạn sẽ muốn tối ưu hóa nhiều hơn nếu bạn đang làm việc trên một ứng dụng máy tính để bàn.

Nó thường đi xuống để giao dịch giữa hiệu suất và mã sang trọng. Cho phép nói rằng bạn đã tạo ra cơ sở mã tuyệt vời, bảo trì và dễ hiểu nhất trên thế giới. Ngay sau khi chúng tôi ném vào một số tối ưu hóa hiệu suất, chúng tôi bắt đầu đám mây mã với một số có thể truy cập trực quan, công cụ rất chuyên ngành. Nếu chúng tôi đã đi đến thị trấn trên tối ưu hóa nó, chúng tôi có thể có thể làm cho một hiệu suất tiết kiệm nói 5 hoặc 10 phần trăm, nhưng trong quá trình completley phá hủy sự thanh lịch của mã.

Câu hỏi là "Có đáng không?".

Nếu hiệu suất là tuyệt đối quan trọng đối với dự án của bạn, hãy chạy trình lược tả trên mã của bạn. Nếu bạn thấy rằng 90% thời gian xử lý của bạn đang được ăn bởi một phương pháp đặc biệt không hiệu quả, thì phương pháp đó là một ứng cử viên tốt cho tối ưu hóa. Nó thường không có giá trị theo đuổi lợi ích hiệu suất thấp trừ khi bạn đang làm việc trên một ứng dụng quan trọng hiệu suất.

6

Tôi làm việc trên Windows CE để loại điều này đôi khi có liên quan hơn một chút.Ví dụ một ứng dụng phản chiếu brash thực sự có thể bị tổn thương vì vậy chúng ta có xu hướng tránh phản chiếu ở nơi nhạy cảm (các ứng dụng phản chiếu rõ ràng là fine). Rõ ràng là tôi không có điên rồ như vậy trên máy tính để bàn.

Tôi đã nghe mọi người lẩm bẩm về các đại biểu và hiệu suất CE nhưng theo như tôi lo ngại về guff của nó. Tôi nghe nói rằng nó "làm chậm phương thức gọi 30%" nhưng nếu đó là 30% của thuật toán crappy thì lỗi của nó là gì? Một chậm lại trong CE là phương pháp ảo, vì không có bảng tra cứu nó làm việc bằng tay chúng ra lần đầu tiên và lưu trữ kết quả. Điều này có nghĩa là nếu bạn tẩy đi tất cả bộ nhớ của bạn, những bộ nhớ cache đó sẽ bị xóa và nó sẽ dẫn đến một cú đánh hoàn hảo vào lần sau. Nhưng điều đó được cân nhắc, liệu bạn có nên vứt bỏ các kỹ năng OOP hữu ích vì lợi ích của hiệu suất không?

Tôi thấy rằng rất nhiều "OMG không sử dụng nó quá chậm" chỉ là lý do. Chủ yếu là lý do vì mọi người không biết whats thực sự sai với ứng dụng của họ và dễ dàng đổ lỗi cho một số hoạt động nội bộ của CLR thay vì mã của riêng họ. Nếu hiệu suất của bạn hút sau đó tôi nghĩ rằng 99,9% thời gian bạn có thể thay đổi một cái gì đó trong một phần của ứng dụng hoặc thiết kế mà không vứt bỏ các công cụ và kết quả trong cải tiến tốt hơn nhiều.

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