Chris, On 6/17/13 11:38 AM, Christopher Schultz wrote: >> Mark Thomas wrote >>> I haven't actually written any performance tests, but looking at the >>> code it seems that HexUtils.toHexString would execute slightly faster >>> for a 16-byte array because of repeated integer multiplication in the loop. >> >> I'd want to see some hard numbers on both methods before making are >> decisions based on performance. > > I'll write some micro benchmarks and post the results.
Here's what I got for 10 runs in the same JVM run. Code at the bottom.
Looks like a dead heat, but I got all kinds of data all over the
place... sometimes HexUtils really beats MD5Encoder badly and sometimes
the opposite.
MD5Encoder HexUtil
495ms 409ms
397ms 396ms
401ms 401ms
401ms 398ms
403ms 401ms
398ms 400ms
400ms 405ms
402ms 401ms
398ms 413ms
400ms 395ms
I'll see if I can tweak each of the implementations -- I think there is
an improvement or two that can be made.
-chris
PS the code:
import org.apache.catalina.util.MD5Encoder;
import org.apache.tomcat.util.buf.HexUtils;
public class DigestEncoderPerfTest
{
static MD5Encoder md5encoder = new MD5Encoder();
public static void main(String[] args)
throws Exception
{
final byte[] testBytes = "thisisatestABCDE".getBytes("US-ASCII");
final long iterations = 10000000;
final int times = 10;
// Warm-up the JIT
testMD5Encoder(10, testBytes);
testHexEncoder(10, testBytes);
testMD5Encoder(10, testBytes);
testHexEncoder(10, testBytes);
testMD5Encoder(10, testBytes);
testHexEncoder(10, testBytes);
long elapsed;
System.out.println("MD5Encoder\tHexUtil");
for(int i=0; i<times; ++i)
{
elapsed = System.currentTimeMillis();
testMD5Encoder(iterations, testBytes);
elapsed = System.currentTimeMillis() - elapsed;
System.out.print(elapsed + "ms");
elapsed = System.currentTimeMillis();
testMD5Encoder(iterations, testBytes);
elapsed = System.currentTimeMillis() - elapsed;
System.out.println("\t" + elapsed + "ms");
}
}
public static void testMD5Encoder(final long iterations,
final byte[] b)
{
for(long i = 0; i < iterations; ++i)
md5encoder.encode(b);
}
public static void testHexEncoder(final long iterations,
final byte[] b)
{
for(long i = 0; i < iterations; ++i)
HexUtils.toHexString(b);
}
}
signature.asc
Description: OpenPGP digital signature
