On Fri, 18 Dec 2020 13:39:48 GMT, Alan Bateman <al...@openjdk.org> wrote:
>>> If there is a holder class for the MessageDigest then its initialisation >>> can fail, this would allow the orThrow method to go away >> >> As of allowing `Md5Digest` instead of explicitly throwing the exception from >> `orThrow` I think that the latter is more appropriate as in case of allowing >> the class initialization to fail all non-first calls will lead to >> `NoClassDefFoundError` which will be counterintuitive from users' >> perspective although the behaviour is simply unspecified for this in >> contract of `nameUUIDFromBytes` (Javadoc of `MessageDigest` requires the >> existence of `SHA-1` and `SHA-256` but nothing is said about `MD5` (should a >> bug-report be raised for the purpose of specifying this detail in the >> Javadoc?). >> >>> Are you planning to add a microbenchmark to demonstrate the issue? >> >> As for testing I am ready to write a benchmark but I am unsure what is the >> canonical way to write the one comparing the value before and after >> changeset. Or should it simply be a comparison of the very approach used >> here, not exactly the changed method (i.e. writing the benchmarks using the >> try/catch variant and holder variant and comparing these)? Could you please >> give any example of such if there are some. >> >> Thanks in advance! > > Can you look in test/micro for existing examples? > > It might be that the right place to cache is in MessageDigest rather than > UUID so that other code can benefit too. > > One other point is that Standard Algorithms specifies that MD5 is supported > by MessageDigest so the JDK would be broken it could not be found. If the > eventual patch is in UUID then this aspect will need a bit of cleanup. There are pre-existing microbenchmarks for java.security under test/micro/org/openjdk/bench/java/security You can build and run these using `make test TEST=micro:YourBenchmark`. Refer to [doc/testing.md](https://github.com/openjdk/jdk/blob/master/doc/testing.md) for some required configuration steps. I'd suggest starting with a simple micro that zooms in on MessageDigest.getInstance("MD5"), maybe like so: /* * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package org.openjdk.bench.java.security; import java.security.DigestException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.util.Random; import java.util.concurrent.TimeUnit; import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; import org.openjdk.jmh.annotations.Fork; import org.openjdk.jmh.annotations.Measurement; import org.openjdk.jmh.annotations.Mode; import org.openjdk.jmh.annotations.OutputTimeUnit; import org.openjdk.jmh.annotations.Param; import org.openjdk.jmh.annotations.Scope; import org.openjdk.jmh.annotations.Setup; import org.openjdk.jmh.annotations.State; import org.openjdk.jmh.annotations.Warmup; /** * Tests speed of looking up MessageDigests. */ @State(Scope.Thread) @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.NANOSECONDS) @Warmup(iterations = 5, time = 1) @Measurement(iterations = 10, time = 1) @Fork(value = 3) public class GetMessageDigest { @Benchmark @Warmup(iterations = 5, time = 1) @Measurement(iterations = 10, time = 1) public MessageDigest getMD5Digest() throws NoSuchAlgorithmException { return MessageDigest.getInstance("MD5"); } } ------------- PR: https://git.openjdk.java.net/jdk/pull/1821