I increased the throughput of the UnixMD5Crypt.crypt by
300%+ based on a highly sofisticated benchmark of
"running 1000 times and computing the elapsed time" (at
least I'm using ISO scheduling, which gives pretty
stable results). As a side-effect the memory usage is
reduced to about a third (it takes 8-9 runs to induce a
full garbage collection in contrast to 3 in the old code).
The biggest enhancement is given by not instantiating a
MD5 instance every time a digest is needed. The same
instance can be used through the life of the method.
Note that I'm not using any extra static storage or
adding usage conditions, the method is used exactly as
before.
Using the final keyword on the class and the to64 seems
to help a little bit, too. That lets the compiler
inline some code and do other optimizations.
The rest of the changes are not crucial, but I moved
the StringBuffer initialization to the bottom because
it's not needed before. I also added the
NoSuchAlgorithmException, because I don't like null
values being returned without a good reason (and that's
the reason I started looking at this method to begin
with *1) and the rest of jYMSG already had the
try/catch blocks for that exception anyway.
*1 -- there seems to be a bug in IBM's crypto engine
that causes two simultaneous MessageDiggest.getInstance
calls to fail, or something like that. It hit me twice
within this method in the last couple months and there
doesn't seem to be another possible reason. My
modifications also reduce the chance of hitting this
bug by a factor of 1003 ;-)