2008-11-19 91 views
25

Đối với một phân khúc cụ thể của mã Java, tôi muốn để đo:Đo Java thời gian thực hiện, sử dụng bộ nhớ và CPU cho một đoạn mã

  • Execution time (hầu hết thời gian thực hiện chủ đề)
  • Memory sử dụng
  • CPU tải (cụ thể là do đoạn mã)

Tôi là người mới sử dụng Java tương đối và không quen với cách thức này có thể đạt được. Tôi đã được giới thiệu đến JMX, tuy nhiên tôi không chắc chắn làm thế nào mà có thể được sử dụng, và JMX trông hơi 'nặng' cho những gì tôi đang tìm kiếm để làm.

Lý tưởng nhất là tôi muốn một số lớp đo lường có thể được cho biết những gì tôi muốn đo, với tùy chọn gọi phương thức start() trước phân đoạn mã và sau đó là phương thức stop(). Số liệu có liên quan sẽ được ghi vào tệp tôi chỉ định.

Ví dụ:

import com.example.metricLogger; 

metricLogger logger = new metricLogger(); 

logger.setLogPath(pathToLogFile); 
logger.monitor(executionTime); 
logger.monitor(memoryUsage); 
logger.monitor(cpuLoad); 

logger.start(); 

/* Code to be measured */ 

logger.stop(); 

Có bất kỳ tiêu chuẩn/common/cách thông thường để đạt được điều này trong Java?

Đo lường như vậy là để so sánh hiệu suất một lần và vì vậy tôi không tìm kiếm bất kỳ quy trình giám sát dài hạn trong sản xuất nào.

Tôi rất vui khi được giới thiệu đến các hướng dẫn hoặc ví dụ bên ngoài và không mong đợi câu trả lời đầy đủ tại đây. Điều đó nói rằng, nếu bất cứ điều gì đơn giản như trên có thể đạt được một ví dụ thực tế sẽ đi xuống thực sự tốt.

Trả lời

19

Việc lập hồ sơ có thể là một lựa chọn dễ dàng hơn vì bạn không yêu cầu số liệu thống kê trong sản xuất. Profiling cũng không yêu cầu sửa đổi mã. VisualVM (mà tàu w/JDK 1.6.06+) là một công cụ đơn giản. Nếu bạn muốn một cái gì đó sâu hơn tôi muốn đi với Eclipse TPTP, Netbeans profiler, hoặc JProfiler (trả tiền).

Nếu bạn muốn viết bạn sở hữu, hãy xem xét những điều sau đây:

measurments đơn giản như thời gian thực hiện có thể được thực hiện bằng cách "clocking" phần bạn quan tâm:

long start = System.nanoTime(); // requires java 1.5 
// Segment to monitor 
double elapsedTimeInSec = (System.nanoTime() - start) * 1.0e-9; 

Bạn có thể sử dụng một kỹ thuật tương tự để giám sát bộ nhớ thông qua các phương thức Runtime.getRuntime(). * memory(). Hãy ghi nhớ rằng theo dõi việc sử dụng bộ nhớ trong một môi trường thu gom rác là phức tạp hơn phép trừ đơn giản.

CPU tải là khó có thể đo lường trong Java, tôi thường gắn bó với thời gian thực hiện và tối ưu hóa còn/phần lặp đi lặp lại

+4

Kết quả đo lường có thể bao gồm thời gian thu gom rác, thời gian dành cho trình biên dịch JIT. trong hệ điều hành do các quá trình khác, thời gian thực hiện bởi các quá trình khác, hoặc thời gian thực hiện "phân đoạn giám sát" có thể là hai đơn đặt hàng nhỏ hơn thời gian để gọi 'nanoTime()'. Chỉ vì 'nanoTime()' trả về nano giây không có nghĩa là độ phân giải quá cao. – jmg

+0

OP cũng yêu cầu đo mức sử dụng bộ nhớ. Những profilers đó có thể đo lường điều đó không? (Tôi nghi ngờ không) – Raedwald

1

Sử dụng Java Profiler là lựa chọn tốt nhất và nó sẽ cung cấp cho bạn tất cả các cái nhìn sâu sắc mà bạn cần vào mã. viz Response Times, Thread CallTraces, Memory Utilisations, vv

Tôi sẽ đề nghị bạn JENSOR, một Java Profiler mã nguồn mở, để dễ sử dụng và chi phí thấp trên CPU.Bạn có thể tải xuống, thiết lập mã và sẽ nhận được tất cả thông tin bạn cần về mã của bạn.

Bạn có thể tải về từ: http://jensor.sourceforge.net/

+2

Nó không thể cho một profiler để có * không * cpu overhead. Mặc dù điều này có thể có một vài chi phí đặc biệt, tôi không biết điều này. – jmg

5

Với ThreadMXBean bạn có thể nhận sử dụng CPU của đề cá nhân và thời gian CPU tiêu thụ chứ không phải trôi qua thời gian mà có thể hữu ích.

Tuy nhiên, việc sử dụng hồ sơ thường đơn giản hơn vì quá trình này thường tạo ra nhiều dữ liệu và bạn cần một công cụ trực quan hóa tốt để xem điều gì đang diễn ra.

Tôi sử dụng Yourkit vì tôi thấy dễ dàng hơn trong việc giải quyết các vấn đề mà các trình thu thập thông tin khác mà tôi đã sử dụng. Tôi cũng sử dụng hprof được xây dựng vì điều này có thể cung cấp cho bạn một cái nhìn khác về hồ sơ của ứng dụng của bạn (nhưng không hữu ích)

+1

Xem thêm hướng dẫn này về ThreadMXBean: http://nadeausoftware.com/articles/2008/03/java_tip_how_get_cpu_and_user_time_benchmarking – utapyngo

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