hprof-parser icon indicating copy to clipboard operation
hprof-parser copied to clipboard

Improve performance by skipping bytes instead of parsing again on a second pass (or first)

Open dkomanov opened this issue 1 year ago • 1 comments

For 2GB heap dump:

$ wc large.hprof 
   2545071   20258239 2438383468 large.hprof

Baseline performance (ParallelGC is much better):

$ time java -Xmx5G -XX:+UseParallelGC -cp $CLASSPATH edu.tufts.eaftan.hprofparser.Parse --handler=edu.tufts.eaftan.hprofparser.handler.NullRecordHandler large.hprof

real	0m34.781s
user	0m39.424s
sys	0m1.759s

$ time java -Xmx5G -XX:+UseG1GC -cp $CLASSPATH edu.tufts.eaftan.hprofparser.Parse --handler=edu.tufts.eaftan.hprofparser.handler.NullRecordHandler large.hprof

real	0m42.754s
user	0m57.383s
sys	0m3.121s

After optimizations:

$ time java -Xmx5G -XX:+UseParallelGC -cp $CLASSPATH edu.tufts.eaftan.hprofparser.Parse --handler=edu.tufts.eaftan.hprofparser.handler.NullRecordHandler large.hprof

real	0m24.539s
user	0m25.911s
sys	0m1.373s

Other possible optimizations:

  • Increase buffer size for BufferedInputStream. Tried it, at most 200 milliseconds gain (variability is bigger).
  • Change primArrayDump interface to use native primitive arrays instead of Value<?>[]. It gives significant gain: 16 seconds against 24 seconds.

dkomanov avatar Sep 16 '24 15:09 dkomanov

This is how primArrayDump optimization would look like: https://github.com/dkomanov/hprof-parser/commit/81891b2a59818663e04bc1bcc49392bf3e2322e0

dkomanov avatar Sep 16 '24 15:09 dkomanov