2010-08-21 37 views
5

Tôi có một ứng dụng .NET và nó chạy nhanh qua khoảng 2000 bản ghi bắt đầu chạy rất chậm. Tôi đang cố gắng tìm ra nút cổ chai và tôi đã tự hỏi liệu có tốt hay không, nhưng nó không phải là công cụ hay một cách để tìm ra nút cổ chai. Tôi đang cố gắng tìm một danh sách chưa được xóa nhưng tôi chưa thấy nó. Tôi có VS 2008.Tìm nút cổ chai trong ứng dụng

+1

Bạn có thể muốn xem qua WinDbg và SoS - http://windbg.dumpanalysis.org/ Bạn có thể lấy một kết xuất bộ nhớ của ứng dụng khi nó chậm lại và phân tích nó cho các tài nguyên chưa được phát hành –

+0

Có mã nào không có thể đăng bài? –

+0

Bạn đang sử dụng phiên bản Visual Studio nào? Trong các phiên bản Phát triển/Suite VS2008, có một trình biên dịch được xây dựng sẵn cho cả mã nguồn gốc và mã được quản lý (tiết lộ: Tôi đang trong nhóm xây dựng nó). –

Trả lời

8

Bạn có thể bắt đầu chạy một số performance counters để theo dõi số liệu thống kê sử dụng CPU và bộ nhớ và tìm hiểu điều gì đang xảy ra.

Nếu điều đó không dẫn bạn đến bất kỳ câu trả lời rõ ràng nào, đã đến lúc bắt đầu lập hồ sơ.

JetBrains dotTrace có bản dùng thử miễn phí 30 ngày. Đó là một bộ nhớ khá tốt và hiệu suất profiler bạn có thể muốn kiểm tra.

Microsoft CLR Profiler miễn phí.

Nếu bạn vẫn không tìm thấy gì, đây là lúc để giải phóng những khẩu súng lớn: WinDbg. Nếu bạn nhận được điều này đến nay, bạn sẽ tìm thấy Tess' blog vô cùng hữu ích.

+0

+1 Tham chiếu tốt. [.Net Framework 4 Profiler] (http://www.microsoft.com/en-us/download/details.aspx?id=16273) – Sam

1

This page từ Adam Calderon liên kết đến một số trang blog MSDN trên hồ sơ.

Tuy nhiên, hầu hết (nếu không phải tất cả) trong số đó dường như là về Hệ thống nhóm Visual Studio. Vì vậy, nếu bạn có quyền truy cập vào phiên bản phần mềm đó, bạn sẽ nhận được một số công cụ "miễn phí".

+2

Rất buồn. Tôi vừa đọc (http://blogs.msdn.com/b/ianhu/archive/2007/09/14/pinpoint-a-performance-issue-using-hotpath-in-visual-studio-2008.aspx) Nếu bạn muốn trở thành một công ty Giga-đô la, bán cho mọi người những gì họ nghĩ họ muốn, chứ không phải những gì hiệu quả. "Hotpath" của họ dựa trên ý tưởng rằng những gì bạn đang tìm kiếm là nơi mà CPU dành nhiều thời gian (điểm nóng hoặc những nơi có chi phí độc quyền cao). Nó hoàn toàn bỏ qua các trang web cuộc gọi trung gian hợp lý kém và nó bị mù với I/O. Họ nên sử dụng các ứng dụng thực (rất nhiều I/O cấp thấp, cấu trúc dữ liệu lớn). Mandelbrot là một món đồ chơi không đại diện. –

0

DevPartner cho C++ MicroFocus của tôi (trước đây là Compuware) có một hồ sơ hiệu suất đã được nửa chừng phong nha. Intel làm cho V-Tune làm điều tương tự. (Tôi nghĩ đó là Intel ... Tôi chưa bao giờ sử dụng nó). Yêu thích của tôi là một trong đó đi kèm với Visual Studio Team Edition. Thật tuyệt vời. Bạn cũng nên cụ thể mã của riêng bạn và viết các bài kiểm tra tự động để bạn có thể so sánh một bản dựng này với bản dựng tiếp theo.

5

Có một công cụ miễn phí rất tốt và bạn đã có nó. Đó là bất lợi duy nhất là nó có thể không trực quan, để bắt đầu.

Khi chương trình hoạt động chậm, hãy tạm dừng nó trong IDE. Kiểm tra ngăn xếp cuộc gọi. (Tôi tắt hiển thị các đối số; Tôi chỉ quan tâm đến các dòng mã cụ thể. Tôi sao chép toàn bộ ngăn xếp ra một trình soạn thảo văn bản, như notepad.) Thực hiện việc này vài lần. Nó càng chậm thì bạn càng cần ít mẫu hơn trước khi bạn gặp vấn đề.

Nếu bạn thấy một hoặc nhiều câu lệnh phổ biến đáng ngờ, giống như chúng xuất hiện trên một phần mẫu khỏe mạnh (ít nhất là hai), bạn nên chú ý đến chúng. Những gì tôi làm là lấy một vài mẫu nữa cho đến khi chúng xuất hiện, bởi vì tôi muốn hiểu tại sao chúng lại bị xử tử. Điều đó quan trọng, bởi vì nếu tôi có thể thay thế chúng bằng thứ gì đó mất ít thời gian hơn nhiều, tôi sẽ tiết kiệm một phần lớn.

Tôi sẽ cố gắng giải thích lý do tại sao nó hoạt động. Đầu tiên, khái niệm chung về "nút cổ chai" là gây hiểu nhầm nghiêm trọng. Phần mềm không chậm vì nó có các chướng ngại hoặc những nơi "nóng". Tất nhiên nó có thể có bộ nhớ cache và vv, nhưng lý do chi phối nó chậm là nó đang làm nhiều hơn nhu cầu - thường là nhiều hơn.

Nó sẽ tắt trên các cuộc gọi chức năng lồng nhau hoang dã, với các biện minh ngày càng nhiều từ xa. Điều này hiển thị dưới dạng cây cuộc gọi rậm rạp hơn mức cần thiết. Tất cả những gì bạn phải làm là tìm những cành cây lớn mà bạn có thể cắt tỉa. Đó là những gì kỹ thuật tạm dừng thực hiện.

Vì vậy, trong khi bạn lục lọi xung quanh cho công cụ sẽ giúp bạn chơi thám tử để tìm "nút cổ chai" khó nắm bắt, là một bác sĩ phẫu thuật cây và tỉa cành nặng nhất bạn có thể từ cây gọi, như tìm thấy bằng cách tạm dừng, và tiếp tục làm điều đó cho đến khi bạn không thể.

Thật tốt khi hoài nghi, nhưng bạn có thể ngạc nhiên về hiệu quả hoạt động của nó.

+0

Kỹ thuật thú vị, +1 – Andy

+0

Hoặc, bạn chỉ có thể sử dụng một hồ sơ sẽ ghi lại cây cuộc gọi của bạn cho mỗi luồng với nhiều số liệu thống kê hữu ích mà bạn sẽ không nhận được từ IDE. –

+0

@Winston: Không tranh luận, nhưng nó sẽ không ghi lại cây gọi của bạn (điều đó là không thể) và nó mang lại cho bạn nhiều số liệu thống kê, nhưng chúng thường làm * không * chỉ cho bạn các vấn đề. Các profilers tốt nhất (IMO) chẳng hạn như Zoom, trong đó lấy mẫu các ngăn xếp cuộc gọi (trên đồng hồ treo tường) và cho bạn biết cho mỗi dòng (không phải cho mỗi hàm)% của các mẫu ngăn chứa dòng. "Thời gian tự", số lượng cuộc gọi, thời lượng cuộc gọi trung bình, là số liệu thống kê phổ biến và vô dụng, cũng như biểu đồ cuộc gọi: http://stackoverflow.com/questions/1777556/alternatives-to-gprof/1779343#1779343 –

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