2009-10-25 7 views
14

Tôi đang tìm cách để thực hiện cuộc gọi phương thức chuẩn trong C#.Cuộc gọi phương thức đo điểm chuẩn trong C#

Tôi đã mã hóa cấu trúc dữ liệu để phân cấp trường đại học và chỉ cần tìm cách tối ưu hóa một chút, nhưng theo cách có thể thêm một chút chi phí trong mọi tình huống, đồng thời chuyển cuộc gọi O (n) sang O (1) trong một số.

Bây giờ tôi muốn chạy cả hai phiên bản đối với dữ liệu thử nghiệm để xem liệu nó có đáng để triển khai tối ưu hóa hay không. Tôi biết rằng trong Ruby, bạn có thể bọc mã trong một khối Benchmark và có nó đầu ra thời gian cần thiết để thực hiện các khối trong giao diện điều khiển - là có một cái gì đó như thế có sẵn cho C#?

Trả lời

3

Bạn có thể sử dụng sẵn có Stopwatch class để "Cung cấp một tập hợp các phương pháp và thuộc tính mà bạn có thể sử dụng để đo chính xác thời gian đã trôi qua". nếu bạn đang tìm kiếm một cách thủ công để làm điều đó. Không chắc chắn về mặc dù tự động.

+0

Cảm ơn, đó là những gì tôi cần. –

+1

Nghe những lời "chỉ là những gì tôi cần" nhắc tôi nhớ đến Mario. – contactmatt

+0

đồng hồ bấm giờ không phải là cách tốt nhất để Điểm chuẩn. Nó sử dụng thanh ghi của bộ vi xử lý để mã của riêng bạn không thể sử dụng nó. Bạn có thể chuẩn mã với đồng hồ bấm giờ và không có nó và sự khác biệt là lên đến 3x lần – Evgeniy

2

Có vẻ như bạn muốn có một profiler. Tôi rất muốn giới thiệu bản thân mình EQATEC profiler, đó là bản miễn phí tốt nhất mà tôi đã thử. Những điều tốt đẹp về phương pháp này trên một đồng hồ bấm giờ đơn giản là nó cũng cung cấp một phân tích về hiệu suất trên một số phương pháp/khối.

+2

+1 cho một hồ sơ miễn phí tốt đẹp! – TrueWill

5

Tôi đã ăn cắp hầu hết các nội dung sau từ phương pháp Jon Skeet cho điểm chuẩn:

private static void Benchmark(Action act, int interval) 
{ 
    GC.Collect(); 
    Stopwatch sw = Stopwatch.StartNew(); 
    for (int i = 0; i < interval; i++) 
    { 
     act.Invoke(); 
    } 
    sw.Stop(); 
    Console.WriteLine(sw.ElapsedMilliseconds); 
} 
+0

Thêm GC.Collect() cục bộ có thể khiến bạn bỏ lỡ các vấn đề phân bổ bộ nhớ toàn cầu ảnh hưởng đến hiệu suất, tuy nhiên nó làm cho các phép đo cục bộ chính xác hơn. –

0

Profilers cung cấp cho các tiêu chuẩn tốt nhất kể từ khi họ chẩn đoán tất cả các mã của bạn, tuy nhiên họ làm chậm nó xuống rất nhiều. Profilers được sử dụng để tìm ra tắc nghẽn.

Để tối ưu hóa thuật toán, khi bạn biết vị trí của nút cổ chai, hãy sử dụng từ điển tên -> đồng hồ bấm giờ, để theo dõi các phần quan trọng về hiệu suất trong thời gian chạy.

22

bị đánh cắp (và sửa đổi) từ câu trả lời của Yuriy:

private static void Benchmark(Action act, int iterations) 
{ 
    GC.Collect(); 
    act.Invoke(); // run once outside of loop to avoid initialization costs 
    Stopwatch sw = Stopwatch.StartNew(); 
    for (int i = 0; i < iterations; i++) 
    { 
     act.Invoke(); 
    } 
    sw.Stop(); 
    Console.WriteLine((sw.ElapsedMilliseconds/iterations).ToString()); 
} 

Thường thì một phương pháp cụ thể có thể khởi tạo một số điều, và bạn không phải lúc nào cũng muốn bao gồm những chi phí khởi tạo trong benchmark tổng thể của bạn. Ngoài ra, bạn muốn chia tổng thời gian thực hiện cho số lần lặp lại, sao cho ước tính của bạn ít nhiều độc lập với số lần lặp lại.

+0

Rất tốt, tôi chỉ đang tìm kiếm một phương pháp đánh giá nhanh C#. –

+7

Và tìm thấy câu trả lời bắt nguồn từ một trong những câu trả lời của riêng bạn? StackOverflow đã được khoảng đủ dài bây giờ mà đã xảy ra với tôi một vài lần: qua tôi trả lời một câu hỏi mà hiện tại tôi đang yêu cầu. – MusiGenesis

+0

Ví dụ: 'Điểm chuẩn (() => {/ * mã của bạn * /}, 100);' – 2Toad

6

Dưới đây là một số điều tôi đã tìm thấy bằng bản dùng thử và lỗi.

  1. Hủy lô lặp đầu tiên (hàng nghìn) lần lặp. Họ sẽ rất có thể bị ảnh hưởng bởi JITter.
  2. Chạy điểm chuẩn trên đối tượng Thread riêng biệt có thể cho kết quả tốt hơn và ổn định hơn. Tôi không biết tại sao.
  3. Tôi đã thấy một số người sử dụng Thread.Sleep vì bất kỳ lý do gì trước khi thực hiện điểm chuẩn. Điều này sẽ chỉ làm mọi thứ tồi tệ hơn. Tôi không biết tại sao. Có thể do JITter.
  4. Không bao giờ chạy điểm chuẩn khi bật gỡ lỗi. Mã sẽ rất có thể chạy các đơn đặt hàng của cường độ chậm hơn.
  5. Biên dịch ứng dụng của bạn với tất cả các tối ưu hóa được bật. Một số mã có thể bị ảnh hưởng mạnh bởi tối ưu hóa, trong khi các mã khác sẽ không được, do đó việc biên dịch mà không tối ưu hóa sẽ ảnh hưởng đến độ tin cậy của điểm chuẩn của bạn.
  6. Khi biên dịch với tối ưu hóa được bật, đôi khi cần thiết để đánh giá đầu ra của điểm chuẩn (ví dụ: in giá trị, v.v.). Nếu không thì trình biên dịch có thể 'tìm ra' một số tính toán là vô dụng và sẽ không thực hiện chúng đơn giản.
  7. Gọi điện của đại biểu có thể có phí trên đáng chú ý khi thực hiện các tiêu chuẩn nhất định. Tốt hơn là đặt nhiều hơn một lần lặp bên trong ủy nhiệm, do đó chi phí trên không có ít ảnh hưởng đến kết quả của điểm chuẩn.
  8. Trình đơn có thể có chi phí riêng. Họ giỏi nói cho bạn biết phần nào của mã của bạn là tắc nghẽn, nhưng họ không giỏi đánh giá hai thứ khác nhau một cách đáng tin cậy.
  9. Nói chung, các giải pháp đo điểm chuẩn ưa thích có thể có chi phí đáng chú ý. Ví dụ, nếu bạn muốn điểm chuẩn cho nhiều đối tượng bằng cách sử dụng một giao diện, có thể sẽ bị hấp dẫn khi quấn mọi đối tượng trong một lớp. Tuy nhiên, hãy nhớ rằng hàm tạo lớp cũng có chi phí phải được tính đến. Tốt hơn là giữ mọi thứ đơn giản và trực tiếp nhất có thể.