RFR [9] 8151384: Examine sun.misc.ASCIICaseInsensitiveComparator

Peter Levart peter.levart at gmail.com
Wed Mar 9 14:11:50 UTC 2016


Hi Claes,

Here's the pre-post-patch comparison:

import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.infra.Blackhole;

import java.util.concurrent.TimeUnit;
import java.util.jar.Attributes;

@BenchmarkMode(Mode.AverageTime)
@Warmup(iterations = 5)
@Measurement(iterations = 10)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Fork(1)
@State(Scope.Thread)
public class JarAttributesBench {

     /*

pre-patch:

Benchmark                            Mode  Cnt    Score    Error Units
JarAttributesBench.buildAttributes   avgt   10  814.876 ± 10.300 ns/op
JarAttributesBench.lookupAttributes  avgt   10  728.400 ±  4.005 ns/op

post-patch:

Benchmark                            Mode  Cnt    Score   Error Units
JarAttributesBench.buildAttributes   avgt   10  949.266 ± 8.422 ns/op
JarAttributesBench.lookupAttributes  avgt   10  890.683 ± 6.651 ns/op

     */

     private static final String[] keys = {
         "Manifest-Version", "Created-By", "Signature-Version",
         "Class-Path", "Main-Class"
     };

     private Attributes attributes;

     @Setup(Level.Trial)
     public void setup() {
         attributes = buildAttributes();
     }

     @Benchmark
     public Attributes buildAttributes() {
         Attributes attr = new Attributes();
         for (String key : keys) {
             attr.putValue(key, key);
         }
         return attr;
     }

     @Benchmark
     public void lookupAttributes(Blackhole bh) {
         Attributes attr = attributes;
         for (String key : keys) {
             bh.consume(attr.getValue(key));
         }
     }
}



... so nothing drastic.

On 03/09/2016 02:03 PM, Claes Redestad wrote:
>
>
> On 2016-03-09 13:17, Peter Levart wrote:
>>>
>>> When digging through old history to try to find out why 
>>> java.util.jar.Attributes
>>> was ever using ASCIICaseInsensitiveComparator, it was not clear that
>>> performance was the motivation.
>>
>> I guess looking-up a manifest attribute is not a performance critical 
>> operation, you are right. 
>
> Could this be an old startup optimization, since first call to 
> String.toLowerCase/toUpperCase will initialize and pull in 
> java.util.Locale and friends? If so it's probably not effective any more.

Could be, yes.

>
> Coincidentally - due to a recent regression - we're currently spending 
> quite a bit of time parsing manifests of all jar files on the 
> classpath, making ASCIICaseInsensitiveComparator show up prominently 
> in some startup profiles.
>
> /Claes


Regards, Peter




More information about the core-libs-dev mailing list