ProGuard successfully processes any Java bytecode, ranging from small Android applications to entire run-time libraries. It primarily reduces the size of the processed code, with some potential increase in efficiency as an added bonus. The improvements obviously depend on the original code. The table below presents some typical results:

Input ProgramOriginal sizeAfter shrinkingAfter optim.After obfusc.Total reductionTimeMemory usage
Worm, a sample midlet from Oracle's JME10.3 K9.8 K9.6 K8.5 K18 %2 s19 M
Javadocking, a docking library290 K281 K270 K201 K30 %12 s32 M
ProGuard itself648 K579 K557 K348 K46 %28 s66 M
JDepend, a Java quality metrics tool57 K36 K33 K28 K51 %6 s24 M
the run-time classes from Oracle's Java 653 M23 M22 M18 M66 %16 min270 M
Tomcat, the Apache servlet container1.1 M466 K426 K295 K74 %17 s44 M
JavaNCSS, a Java source metrics tool632 K242 K212 K152 K75 %20 s36 M
Ant, the Apache build tool2.4 M401 K325 K242 K90 %23 s61 M

Results were measured with ProGuard 4.0 on a 2.6 GHz Pentium 4 with 512 MB of memory, using Sun JDK 1.5.0 in Fedora Core 3 Linux. All of this technology and software has evolved since, but the gist of the results remains the same.

The program sizes include companion libraries. The shrinking step produces the best results for programs that use only small parts of their libraries. The obfuscation step can significantly shrink large programs even further, since the identifiers of their many internal references can be replaced by short identifiers.

The Java 6 run-time classes are the most complex example. The classes perform a lot of introspection, interacting with the native code of the virtual machine. The 1500+ lines of configuration were largely composed by automated analysis, complemented by a great deal of trial and error. The configuration is probably not complete, but the resulting library successfully serves as a run-time environment for running applications like ProGuard and the ProGuard GUI.

For small inputs, timings are governed by the reading and parsing of the jars. For large inputs, the optimization step becomes more important. For instance, processing the Java 6 run-time classes without optimization only takes 2 minutes.

Memory usage (the amount of physical memory used by ProGuard while processing) is governed by the basic java virtual machine and by the total size of the library jars and program jars.