Как проанализировать производительность Java-класса, не запуская его? - PullRequest
1 голос
/ 04 ноября 2011

Нам нужно реализовать приложение для оценки результатов задач онлайн-программирования. Пользователи будут реализовывать задачи программирования и компилировать свои источники через веб-интерфейс. Мы должны скомпилировать предоставленные источники на лету и представить некоторые статистические данные программы, такие как ожидаемое потребление памяти и возможные показатели производительности источников. Кто-нибудь знает, как мы можем получить статистические данные о потреблении памяти и производительности программы из источников?

Ответы [ 2 ]

2 голосов
/ 04 ноября 2011

Хотя вы могли бы проводить статический анализ источника для определения характеристик производительности, я подозреваю, что было бы гораздо проще просто запустить тестовый набор JUnit поверх кода.

Если вы можете представить свою задачу в видеЗаглушка кода или интерфейс, вы должны быть в состоянии создать подходящий набор JUnit, который проверяет правильность и тестирует производительность.

Конечно, JUnit может быть не лучшим способом выполнения тестов производительности, но вы, вероятно, можете согнуть его под задачу,В качестве альтернативы вы можете посмотреть на JMeter или что-то подобное.

1 голос
/ 05 ноября 2011

Нашел что-то очень полезное. Я не уверен, что это то, что я ищу. Мне еще предстоит проанализировать результаты. Но это довольно интересно. Мы можем собрать некоторую статистику производительности с помощью агента профилирования HPROF, поставляемого с выпуском JDK. Хорошо, что он может быть запущен во время компиляции для получения некоторой интересной статистики по скомпилированному beign-коду. Ниже приведены некоторые образцы. Более подробную информацию можно найти на http://download.oracle.com/javase/7/docs/webnotes/tsg/TSG-VM/html/tooldescr.html#gbluz

$ javac -J-agentlib:hprof=heap=sites Hello.java
SITES BEGIN (ordered by live bytes) Wed Oct 4 13:13:42 2006
          percent          live          alloc'ed  stack class
 rank   self  accum     bytes objs     bytes  objs trace name
    1 44.13% 44.13%   1117360 13967  1117360 13967 301926 java.util.zip.ZipEntry
    2  8.83% 52.95%    223472 13967   223472 13967 301927 com.sun.tools.javac.util.List
    3  5.18% 58.13%    131088    1    131088     1 300996 byte[]
    4  5.18% 63.31%    131088    1    131088     1 300995 com.sun.tools.javac.util.Name[]

$ javac -J-agentlib:hprof=heap=dump Hello.java
HEAP DUMP BEGIN (39793 objects, 2628264 bytes) Wed Oct 4 13:54:03 2006
ROOT 50000114 (kind=<thread>, id=200002, trace=300000)
ROOT 50000006 (kind=<JNI global ref>, id=8, trace=300000)
ROOT 50008c6f (kind=<Java stack>, thread=200000, frame=5)
:
CLS 50000006 (name=java.lang.annotation.Annotation, trace=300000)
    loader        90000001
OBJ 50000114 (sz=96, trace=300001, class=java.lang.Thread@50000106)
    name        50000116
    group        50008c6c
    contextClassLoader    50008c53
    inheritedAccessControlContext    50008c79
    blockerLock    50000115
OBJ 50008c6c (sz=48, trace=300000, class=java.lang.ThreadGroup@50000068)
    name        50008c7d
    threads    50008c7c
    groups        50008c7b
ARR 50008c6f (sz=16, trace=300000, nelems=1, 
     elem type=java.lang.String[]@5000008e)
    [0]        500007a5
CLS 5000008e (name=java.lang.String[], trace=300000)
    super        50000012
    loader        90000001
:
HEAP DUMP END


$ javac -J-agentlib:hprof=cpu=times Hello.java
CPU TIME (ms) BEGIN (total = 2082665289) Wed oct 4 13:43:42 2006
rank   self  accum   count trace method
   1  3.70%  3.70%       1 311243 com.sun.tools.javac.Main.compile
   2  3.64%  7.34%       1 311242 com.sun.tools.javac.main.Main.compile
   3  3.64% 10.97%       1 311241 com.sun.tools.javac.main.Main.compile
   4  3.11% 14.08%       1 311173 com.sun.tools.javac.main.JavaCompiler.compile
   5  2.54% 16.62%       8 306183 com.sun.tools.javac.jvm.ClassReader.listAll
   6  2.53% 19.15%      36 306182 com.sun.tools.javac.jvm.ClassReader.list
   7  2.03% 21.18%       1 307195 com.sun.tools.javac.comp.Enter.main
   8  2.03% 23.21%       1 307194 com.sun.tools.javac.comp.Enter.complete
   9  1.68% 24.90%       1 306392 com.sun.tools.javac.comp.Enter.classEnter
  10  1.68% 26.58%       1 306388 com.sun.tools.javac.comp.Enter.classEnter
...
CPU TIME (ms) END
...