Is it reasonable to compare outputs between JMH and hprof?

Wang Weijun weijun.wang at oracle.com
Thu Dec 4 04:09:49 UTC 2014


Hi All

I am comparing the difference of SHA-1 and SHA-256. First I wrote a JMH benchmark:

@Benchmark
public void sig1(Blackhole bh) throws Exception {
    bh.consume(sig("SHA-1"));
}

@Benchmark
public void sig2(Blackhole bh) throws Exception {
    bh.consume(sig("SHA-256"));
}

byte[] sig(String alg) throws Exception {
    MessageDigest md = MessageDigest.getInstance(alg);
    md.update(new byte[10000]);
    return md.digest();
}

The output is

Benchmark            Mode  Samples      Score      Error  Units
o.o.b.Weird.sig1    thrpt        5  20984.435 ± 3356.455  ops/s
o.o.b.Weird.sig2    thrpt        5  13130.330 ±  976.824  ops/s

so the difference is there but not huge.

Then I wrote a simple app with

public static void main(String args[]) throws Exception {
    int i = Arrays.hashCode(sig("SHA-1"));
    i += Arrays.hashCode(sig("SHA-256"));
    System.out.println(i);
}

static byte[] sig(String alg) throws Exception {
    MessageDigest md = MessageDigest.getInstance(alg);
    md.update(new byte[10000]);
    return md.digest();
}

and then profile it with -agentlib:hprof=cpu=times, and get

SHA2    1 10.16% 10.16%     156 303276 sun.security.provider.SHA2.implCompress
SHA2    2  6.91% 17.07%    9984 303274 sun.security.provider.SHA2.lf_sigma0
SHA2    3  5.28% 22.36%    9984 303271 sun.security.provider.SHA2.lf_sigma1
SHA2    4  4.61% 26.96%    7488 303269 sun.security.provider.SHA2.lf_delta0
SHA2    5  4.20% 31.17%   29952 303273 sun.security.provider.SHA2.lf_S
SHA2    7  3.79% 39.16%    7488 303266 sun.security.provider.SHA2.lf_delta1
SHA2    9  2.85% 44.99%   29952 303270 sun.security.provider.SHA2.lf_S
SHA2   13  1.90% 54.47%   14976 303267 sun.security.provider.SHA2.lf_S
SHA2   17  1.49% 61.25%   14976 303264 sun.security.provider.SHA2.lf_S
SHA2   22  0.81% 66.12%    7488 303265 sun.security.provider.SHA2.lf_R
SHA2   23  0.81% 66.94%    9984 303275 sun.security.provider.SHA2.lf_maj
SHA2   25  0.81% 68.56%     156 303263 sun.security.provider.ByteArrayAccess.b2iBig64
SHA2   27  0.68% 70.05%    9984 303272 sun.security.provider.SHA2.lf_ch
SHA2   31  0.54% 72.63%    7488 303268 sun.security.provider.SHA2.lf_R
SHA1   34  0.54% 74.25%     156 303224 sun.security.provider.SHA.implCompress
SHA1   43  0.41% 78.05%     156 303223 sun.security.provider.ByteArrayAccess.b2iBig64
SHA2   60  0.27% 82.66%    2496 303262 java.lang.Integer.reverseBytes
SHA2   61  0.27% 82.93%      64 303290 sun.security.provider.SHA2.lf_sigma1
SHA1  116  0.14% 91.06%    2496 303222 java.lang.Integer.reverseBytes

These are calls with SHA (i.e. SHA1) or SHA2 in the stack (depth=4), and time for SHA2 vs SHA1 is 45.38% vs 1.09%. With such a small app I don't think SHA or SHA2 is called anywhere else. This is jdk9 b40.

Why is the output so different from JMH? Is it reasonable comparing them?

Thanks
Max




More information about the security-dev mailing list