2010-03-11 22 views
23

Có bất kỳ hướng dẫn lược tả ứng dụng Java được đề xuất nào không?Bất kỳ hướng dẫn lược tả Java nào được đề xuất?

Tôi hiện đang sử dụng JProfilerEclipseTest & Performance Tools Platform (TPTP) bằng hồ sơ của mình. Tuy nhiên, mặc dù được trang bị vũ khí tuyệt vời, như một người mới đến mới trong hồ sơ Java, tôi vẫn còn thiếu lý thuyết và kỹ năng chung trong việc xác định các nút cổ chai.

Trả lời

38

Tiểu sử là một chủ đề có nhiều hơn một trường phái tư duy.

Phổ biến hơn là bạn tiến hành bằng cách nhận được số đo. Tức là, bạn cố gắng xem mỗi hàm mất bao lâu và/hoặc bao nhiêu lần nó được gọi. Rõ ràng, nếu một chức năng mất rất ít thời gian, sau đó tăng tốc nó sẽ giúp bạn đạt được ít. Nhưng nếu phải mất rất nhiều thời gian, thì bạn phải làm công việc thám tử để tìm ra phần nào của hàm chịu trách nhiệm về thời gian. Đừng mong đợi các thời gian của hàm cộng thêm vào tổng thời gian, bởi vì các hàm gọi nhau, và hàm lý do A có thể mất rất nhiều thời gian là nó gọi hàm B cũng mất rất nhiều thời gian. Phương pháp này có thể tìm thấy rất nhiều vấn đề, nhưng nó phụ thuộc vào bạn là một thám tử giỏi và có thể suy nghĩ rõ ràng về các loại thời gian khác nhau, như thời gian đồng hồ so với thời gian CPU, và thời gian tự so với thời gian bao gồm . Ví dụ, một ứng dụng có thể xuất hiện chậm nhưng thời gian hoạt động có thể được báo cáo gần bằng không. Điều này có thể được gây ra bởi chương trình được I/O ràng buộc. Nếu I/O là thứ mà bạn mong đợi, điều đó có thể tốt, nhưng nó có thể làm một số I/O mà bạn không biết, và sau đó bạn quay trở lại công việc thám tử.

Kỳ vọng chung với trình biên dịch là nếu bạn có thể sửa đủ thứ để tăng tốc 10% hoặc 20%, điều đó khá tốt và tôi không bao giờ nghe câu chuyện về trình đơn được sử dụng nhiều lần để tăng tốc nhiều hơn thế.

Một cách tiếp cận khác không phải là để đo lường, nhưng để chụp. Nó được dựa trên ý tưởng rằng, trong một thời gian khi chương trình mất nhiều thời gian hơn (trong thời gian đồng hồ treo tường) hơn bạn muốn, bạn muốn biết nó đang làm gì, chủ yếu là, và một cách để tìm ra là ngăn chặn nó và hỏi, hoặc chụp nhanh trạng thái của nó và phân tích nó để hiểu hoàn toàn những gì nó đang làm và tại sao nó đang làm nó tại thời điểm cụ thể đó.Nếu bạn làm điều này nhiều lần và bạn thấy một cái gì đó mà nó đang cố gắng làm nhiều lần, thì hoạt động đó là thứ mà bạn có thể tối ưu hóa một cách hiệu quả. Sự khác biệt là bạn không yêu cầu số tiền; bạn đang yêu cầu những gìlý do tại sao. Here's another explanation. (Lưu ý rằng tốc độ chụp nhanh như vậy không quan trọng, vì bạn không hỏi về thời gian, bạn đang hỏi chương trình đang làm gì và tại sao.)

Trong trường hợp Java, here is one low-tech but highly effective cách để làm điều đó, hoặc bạn có thể sử dụng nút "tạm dừng" trong Eclipse. Một cách khác là sử dụng một loại profiler cụ thể, một mẫu để lấy mẫu toàn bộ ngăn xếp cuộc gọi, trên đồng hồ treo tường (không phải CPU trừ khi bạn muốn bị mù với I/O), khi bạn muốn mẫu đó (ví dụ, không khi chờ đầu vào của người dùng), và tóm tắt ở cấp độ các dòng mã, không chỉ ở mức hàm, và phần trăm thời gian, không phải thời gian tuyệt đối. Để nhận được phần trăm thời gian, nó sẽ cho bạn biết, đối với mỗi dòng mã xuất hiện trên bất kỳ mẫu nào, phần trăm các mẫu chứa dòng đó, bởi vì nếu bạn có thể làm cho dòng đó biến mất, bạn sẽ tiết kiệm được phần trăm đó. (Bạn nên bỏ qua những thứ khác mà nó cố gắng nói với bạn về, như đồ thị cuộc gọi, đệ quy và thời gian tự). Có rất ít profilers đáp ứng đặc tả này, nhưng một là RotateRight/Zoom, nhưng tôi không chắc liệu nó có hoạt động hay không Java, và có thể có những người khác.

Trong một số trường hợp, có thể gặp khó khăn khi lấy mẫu ngăn xếp khi bạn muốn, trong thời gian chậm thực tế. Sau đó, kể từ những gì bạn đang sau là tỷ lệ phần trăm, bạn có thể làm bất cứ điều gì để mã mà làm cho nó dễ dàng hơn để có được mẫu mà không làm thay đổi tỷ lệ phần trăm. Một cách là để khuếch đại mã bằng cách bao quanh một vòng lặp tạm thời xung quanh nó, ví dụ: 100 lần lặp lại. Một cách khác là, dưới trình gỡ lỗi, để đặt điểm ngắt thay đổi dữ liệu. Điều này sẽ làm cho mã được giải thích chậm hơn 10-100 lần so với bình thường. Một cách khác là sử dụng bộ hẹn giờ báo thức để tắt trong thời gian chậm, và sử dụng nó để lấy mẫu.

Với kỹ thuật chụp, nếu bạn sử dụng nó nhiều lần để tìm và thực hiện nhiều tối ưu hóa, bạn có thể mong đợi đạt được hiệu suất gần tối ưu. Trong trường hợp của phần mềm lớn, nơi mà nút cổ chai là nhiều hơn, điều này có thể có nghĩa là các yếu tố đáng kể. Mọi người trên Stack   Lỗi tràn đã báo cáo các yếu tố từ 7x đến 60x. Here is a detailed example of 43x.

Kỹ thuật chụp ảnh gặp sự cố trong trường hợp khó tìm ra lý do tại sao các chuỗi đang đợi, chẳng hạn như khi chờ giao dịch hoàn tất trên một bộ xử lý khác. (Đo lường có cùng một vấn đề.) Trong những trường hợp đó, tôi sử dụng một phương pháp mất thời gian để hợp nhất các bản ghi có dấu thời gian.

+0

Lưu ý rằng nó không phải là "một hoặc /" - thường rất hữu ích để * đo * một số "chạy thử điển hình" không xâm lấn, sau đó sử dụng profiler như một công cụ chụp để tìm các điểm nóng. Thực hiện các thay đổi của bạn, sử dụng trình biên dịch lặp đi lặp lại, và sau đó chạy lại các phép đo. –

+0

@Jon: Tôi chạy lại phép đo (thường chỉ là đồng hồ bấm giờ) để xem tôi đã giảm bao nhiêu thời gian. Tôi là một người cuồng nhiệt trong phương pháp tìm kiếm những gì cần sửa chữa, hiếm khi là "điểm nóng" khi tôi định nghĩa nó (khu vực mà bộ đếm chương trình bị treo) hoặc "nút cổ chai" (nơi cần làm việc đông đúc) lên). Thông thường nó là ít một lớp lót (hoặc ít hơn) mà cuối cùng gọi lên đống mã (bao gồm cả IO) mà bạn không bao giờ có thể đoán khi bạn mã hóa nó. –

+0

Tôi phát hiện ra rằng chỉ cần sử dụng nút tạm dừng trong trình gỡ lỗi của IDEA là không đủ vì số lượng chủ đề cao.Tôi cần phải tìm đúng chủ đề mỗi lần - một rắc rối lớn. Nhưng, tôi đã tìm thấy thông tin tương tự bằng cách chỉ bán phá giá ngăn xếp theo các khoảng thời gian đều đặn. Không cần tạm dừng chương trình :-) – oligofren

2

JProfiler đi kèm với hướng dẫn trợ giúp. Tôi thấy rằng rất tốt.

4

Là một người mới đến lược tả bạn nên bắt đầu bằng cách đơn giản tìm kiếm các phương pháp có thời gian chạy dài và/hoặc được gọi nhiều lần trong các mẫu sử dụng điển hình/nơi xảy ra hiện tượng tắc nghẽn.

Tôi không chắc chắn cách tích hợp Eclipse với JProfiler hoạt động, vì tôi chủ yếu sử dụng NetBeans. Tuy nhiên, trong NetBeans có chế độ xem 'Ảnh chụp' hiển thị một hệ thống phân cấp các lời gọi phương thức có thời gian chạy tổng cộng lên đến 100%. Tôi tìm kiếm các phần của cấu trúc phân cấp chiếm một% (tương đối) lớn trong tổng thời gian. Từ đó bạn phải suy nghĩ về những gì các phương pháp đang làm, và những gì có thể gây ra chúng được làm chậm.

Ví dụ: Tôi nhận thấy rằng một phương pháp được gọi thường xuyên là tổng thể mất quá nhiều thời gian để hoàn thành và là một nút cổ chai nghiêm trọng. Dài câu chuyện ngắn, nó quay ra các mã đã được kiểm tra để xem nếu một mặt hàng đã có mặt trong một bộ sưu tập bằng cách sử dụng phương pháp .contains(), và bộ sưu tập là một danh sách liên kết. Lý do đây là một vấn đề là bởi vì Danh sách liên kết có độ phức tạp thời gian của O (n) đối với các hàm như .contains(). Bản sửa lỗi trong trường hợp này khá đơn giản vì tôi có thể thay thế Danh sách được liên kết bằng Tập hợp Hash, thực hiện nhanh hơn nhiều, trong thời gian O (1).

+0

thông tin chi tiết hữu ích !! Cảm ơn –

1

Bạn có thể tìm thấy cuốn sách Nền tảng Java hiệu suất thú vị. Xuất bản bởi Sun Microsystems.

9

Tôi đang sử dụng Yourkit Java Profiler 11.0 và nó rất tốt để tối ưu hóa bộ nhớ và theo dõi thời gian CPU. Trang web của bạn cũng có kiến ​​thức cơ bản và các chủ đề trợ giúp.

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