In mentioned method this code snippet

int len = baseName.length() + 1 + name.length();
StringBuilder sb = new StringBuilder(len);
name = sb.append(baseName.replace('.', '/'))
        .append('/')
        .append(name)
        .toString();


can be simplified with performance improvement as

name = baseName.replace('.', '/') + '/' + name;

Also null check of `baseName` can be removed as Class.getPackageName() never 
returns null.

This benchmark

@State(Scope.Thread)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Fork(jvmArgsAppend = {"-Xms2g", "-Xmx2g"})
public class ResolveNameBenchmark {

  private final Class<? extends ResolveNameBenchmark> klazz = getClass();

  @Benchmark
  public Object original() {
    return original("com/tsypanov/ovn/ResolveNameBenchmark.class");
  }

  @Benchmark
  public Object patched() {
    return patched("com/tsypanov/ovn/ResolveNameBenchmark.class");
  }

  private String original(String name) {
    if (!name.startsWith("/")) {
      String baseName = getPackageName();
      if (baseName != null && !baseName.isEmpty()) {
        int len = baseName.length() + 1 + name.length();
        StringBuilder sb = new StringBuilder(len);
        name = sb.append(baseName.replace('.', '/'))
                .append('/')
                .append(name)
                .toString();
      }
    } else {
      name = name.substring(1);
    }
    return name;
  }

  private String patched(String name) {
      if (!name.startsWith("/")) {
          String baseName = getPackageName();
          if (!baseName.isEmpty()) {
              return baseName.replace('.', '/') + '/' + name;
          }
          return name;
      }
      return name.substring(1);
  }

  private String getPackageName() {
    return klazz.getPackageName();
  }
}

demonstrates good improvement, especially as of memory consumption:

                                            Mode  Cnt     Score     Error   
Units

original                                    avgt   50    57.974 ±   0.365   
ns/op
original:·gc.alloc.rate                     avgt   50  3419.447 ±  21.154  
MB/sec
original:·gc.alloc.rate.norm                avgt   50   312.006 ±   0.001    
B/op
original:·gc.churn.G1_Eden_Space            avgt   50  3399.396 ± 149.836  
MB/sec
original:·gc.churn.G1_Eden_Space.norm       avgt   50   310.198 ±  13.628    
B/op
original:·gc.churn.G1_Survivor_Space        avgt   50     0.004 ±   0.001  
MB/sec
original:·gc.churn.G1_Survivor_Space.norm   avgt   50    ≈ 10⁻³              
B/op
original:·gc.count                          avgt   50   208.000            
counts
original:·gc.time                           avgt   50   224.000                
ms

patched                                     avgt   50    44.367 ±   0.162   
ns/op
patched:·gc.alloc.rate                      avgt   50  2749.265 ±  10.014  
MB/sec
patched:·gc.alloc.rate.norm                 avgt   50   192.004 ±   0.001    
B/op
patched:·gc.churn.G1_Eden_Space             avgt   50  2729.221 ± 193.552  
MB/sec
patched:·gc.churn.G1_Eden_Space.norm        avgt   50   190.615 ±  13.539    
B/op
patched:·gc.churn.G1_Survivor_Space         avgt   50     0.003 ±   0.001  
MB/sec
patched:·gc.churn.G1_Survivor_Space.norm    avgt   50    ≈ 10⁻⁴              
B/op
patched:·gc.count                           avgt   50   167.000            
counts
patched:·gc.time                            avgt   50   181.000                
ms

-------------

Commit messages:
 - 8265075: Improve and simplify Class.resolveName()

Changes: https://git.openjdk.java.net/jdk/pull/3464/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=3464&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8265075
  Stats: 11 lines in 1 file changed: 0 ins; 7 del; 4 mod
  Patch: https://git.openjdk.java.net/jdk/pull/3464.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/3464/head:pull/3464

PR: https://git.openjdk.java.net/jdk/pull/3464

Reply via email to