2009-12-12 38 views
45

Trong Java VisualVM, có cách nào để hiển thị tổng thời gian của phương thức, thay vì "thời gian tự" không? (Sau này không phải là đặc biệt hữu ích, vì nó không cho bạn biết bất cứ điều gì về bao nhiêu thời gian phương pháp thực sự để chạy.)Tổng thời gian của phương thức trong Java VisualVM

Nếu không, có bất kỳ độc lập Java miễn phí tính toán tổng thời gian phương pháp?

Trả lời

47

Nhìn vào dữ liệu theo dõi trong chế độ xem "ảnh chụp nhanh" cho phép bạn xem tổng số cũng như thời gian tự.

Nhấn nút "ảnh chụp nhanh" xuất hiện về bảng kết quả. Điều này sẽ tạo một tab mới có chứa chế độ xem "Gọi cây", tính năng này chia nhỏ thời gian tự so với tổng thời gian. Chế độ xem "kết hợp" cũng cung cấp thông tin này, nhưng chia tách không gian màn hình bằng chế độ xem "Điểm phát sóng" tương tự với chế độ xem hồ sơ chuẩn.

Ảnh chụp nhanh có thể được tạo từ dữ liệu "Profiler" hoặc "Sampler" chuẩn. Tuy nhiên, ảnh chụp nhanh "Profiler" chỉ có thể được tạo trước khi ứng dụng được đóng lại, trong khi "Sampler" có thể được tạo bất kỳ lúc nào.

(Thông tin trên được dựa trên VisualVM 1.3.1)

+4

Câu trả lời này là độc nhất và hữu ích nhất. Tôi đã thực hiện một đoạn phim ngắn của nó: http://rhnh.net/2011/08/03/profiling-clojure –

+0

Xavier, cảm ơn vì screencast. Nó làm cho nó rõ ràng. –

-3

bạn có thể sử dụng một

long startTime = System.currentTimeMillis(); 

tại beggining

long endTime = System.currentTimeMillis(); 

và cuối cùng để có được những kết quả

long result = endTime - startTime; //Note, part might be backwards, I don't 
            //Remember 
+0

kết thúc - bắt đầu ... nếu không bạn sẽ kết thúc với một cái gì đó như: 0 - 100 = -100 insead 100 - 0 = 100. – TofuBeer

+0

Cảm ơn vì điều đó, tôi nghĩ rằng tôi có thể đã có nó ngược ... – Brendan

+8

Sử dụng hệ thống .nanoTime(), currentTimeMillis() là lỗi dễ bị do tỷ lệ gián đoạn os: http://blogs.sun.com/dholmes/entry/inside_the_hotspot_vm_clocks –

1

Có một cách đơn giản để có được tổng thời gian của một rou tine như một phần trăm thời gian thực hiện đồng hồ treo tường (thay vì mili giây). Chỉ cần sử dụng ctrl-break để có được một đống stackshots trong khi bạn đang chờ đợi nó. Phần nhỏ trong số đó chứa thông lệ là% thời gian cần thiết. Độ chính xác tùy thuộc vào số lượng ảnh bạn chụp. Nếu bạn chỉ tìm kiếm các vấn đề ở đâu, bạn không cần đo thời gian chính xác. Here's a short explanation of how it works.

7

Chỉ cần chụp nhanh các kết quả lược tả. Bạn sẽ nhận được thời gian đồng hồ treo tường cũng như thời gian tự ở đó.

-1

JavaAssist là một thư viện lớp để thao tác Mã byte Java của bạn mà không cần chạm vào nguồn. Hãy lấy một ví dụ về đo thời gian để thực hiện một phương pháp.

public class Subject { 
    /** 
    * Timetaken for start & end of the method 
    * 
    * @throws InterruptedException 
    */ 
    public void method2() throws InterruptedException { 
     // Some business logic :) 
     Thread.sleep(2000); 
    } 
} 

Để đo thời gian thực hiện để thực hiện subject.method2(), bạn có thể nâng cao Subject.methods() bằng cách thêm mã và bắt đầu cuối của phương pháp này như hình vẽ.

public class JavaAssist { 
    public static void main(String[] args) { 
     timeTaken(); 
    } 

    public static void timeTaken() { 
     try { 
      ClassPool p = ClassPool.getDefault(); 
      CtClass cc = p.get("Subject"); 
      CtMethod meth2 = cc.getDeclaredMethod("method2"); 
      meth2.insertBefore("System.out.println(\" Start : \"+new java.util.Date());"); 
      meth2.insertAfter("System.out.println(\" End : \"+new java.util.Date());"); 
      // cc.writeFile("."); 
      Class c = cc.toClass(); 
      Subject s = (Subject) c.newInstance(); 
      s.method2(); 
      cc.detach(); 
     } catch (Exception e) { 
      // suppressed 
     } 
    } 
} 

Output: bắt đầu: Thứ Tư ngày 26 17:24:18 EDT 2010 End: Thứ Tư ngày 26 17:24:20 EDT 2010

Reference http://www.csg.is.titech.ac.jp/~chiba/javassist/tutorial/tutorial.html#read

http://www.csg.is.titech.ac.jp/~chiba/javassist/html/

Xuất xứ Đăng từ: http://www.senthilb.com/2010/05/javaassist-byte-code-enhancement.html

0

Tôi nghĩ bạn muốn tìm hiểu xem mỗi lần thực hiện phương pháp mất bao nhiêu thời gian. Bạn sẽ muốn sử dụng JETM để theo dõi hiệu suất. Điều này sẽ cho bạn thời gian vào cửa, thời gian thoát và chênh lệch thời gian cho mỗi phương pháp. Bạn sẽ tìm ra phương pháp nào đang mất bao nhiêu thời gian.

Nếu bạn đang sử dụng Spring sau đó nó trở nên dễ dàng tích hợp JETM http://jetm.void.fm/howto/spring_2_x_integration.html

0

bạn có thể sử dụng JProfiler hoặc một số công cụ để giám sát javaagent phương pháp thực hiện thời gian cho you.there là một số công cụ mã nguồn mở trên github, như simpleAPM.

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