Skip to main content

Gauva

Tips#

Performance#

TypeToken#

  • 对性能有一定影响, 谨慎使用
Benchmark                       Mode  Cnt     Score     Error  UnitsBenchTypeToken.generic          avgt   10     4.001 ±   0.197  ns/opBenchTypeToken.typeTokenString  avgt   10   973.403 ±  13.519  ns/opBenchTypeToken.typeTokenTwo     avgt   10  3289.355 ± 134.182  ns/opBenchTypeToken.typeTokenVoid    avgt   10  1019.551 ±  43.565  ns/op
@State(Scope.Thread)@OutputTimeUnit(TimeUnit.NANOSECONDS)@Warmup(iterations = 4)@Measurement(iterations = 10)@BenchmarkMode(Mode.AverageTime)public class BenchTypeToken {  public static void main(String[] args) throws RunnerException {    Options options =        new OptionsBuilder()            .include(BenchTypeToken.class.getSimpleName())            .threads(1)            .forks(1)            .shouldFailOnError(true)            .shouldDoGC(true)            .jvmArgs("-server")            .measurementTime(TimeValue.seconds(2))            .build();    new Runner(options).run();  }
  @Benchmark  public void typeTokenString(Blackhole bh) {    bh.consume(new ATyped());  }
  @Benchmark  public void typeTokenVoid(Blackhole bh) {    bh.consume(new ATyped());  }
  @Benchmark  public void typeTokenTwo(Blackhole bh) {    bh.consume(new ATyped2());  }
  @Benchmark  public void generic(Blackhole bh) {    bh.consume(new AGen());  }
  static class ATyped extends TypedImpl<Void> {}
  static class ATypedS extends TypedImpl<String> {}
  static class ATyped2 extends TypedImpl2<Void, Void> {}
  static class AGen extends GenImpl<Void> {}
  @Getter  @Setter  static class TypedImpl<IN> {
    private final TypeToken<IN> in = new TypeToken<IN>(getClass()) {};  }
  @Getter  @Setter  static class TypedImpl2<IN, OUT> {
    private final TypeToken<IN> in = new TypeToken<IN>(getClass()) {};    private final TypeToken<OUT> out = new TypeToken<OUT>(getClass()) {};  }
  @Getter  @Setter  static class GenImpl<IN> {}}

Immutable#

  • 比正常的性能稍微好一点点
Benchmark                     Mode  Cnt     Score     Error  UnitsBenchImmutable.immutableList  avgt   10  4288.096 ±  97.184  ns/opBenchImmutable.immutableMap   avgt   10  7922.092 ± 368.066  ns/opBenchImmutable.list           avgt   10  4739.961 ± 131.327  ns/opBenchImmutable.map            avgt   10  8779.917 ± 498.843  ns/op
@State(Scope.Thread)@OutputTimeUnit(TimeUnit.NANOSECONDS)@Warmup(iterations = 4)@Measurement(iterations = 10)@BenchmarkMode(Mode.AverageTime)public class BenchImmutable {  public static void main(String[] args) throws RunnerException {    Options options =        new OptionsBuilder()            .include(BenchImmutable.class.getSimpleName())            .threads(1)            .forks(1)            .shouldFailOnError(true)            .shouldDoGC(true)            .jvmArgs("-server")            .measurementTime(TimeValue.seconds(8))            .build();    new Runner(options).run();  }
  @Benchmark  public void list(Blackhole bh) {    ArrayList<Integer> list = Lists.newArrayList();    for (int i = 0; i < 100; i++) {      list.add(i);    }    for (int i = 0; i < 1000; i++) {      bh.consume(list.get(i % 100));    }  }
  @Benchmark  public void immutableList(Blackhole bh) {    Builder<Integer> builder = ImmutableList.builder();    for (int i = 0; i < 100; i++) {      builder.add(i);    }    ImmutableList<Integer> list = builder.build();    for (int i = 0; i < 1000; i++) {      bh.consume(list.get(i % 100));    }  }
  @Benchmark  public void map(Blackhole bh) {    HashMap<Integer, Integer> map = Maps.newHashMap();
    for (int i = 0; i < 100; i++) {      map.put(i, i);    }    for (int i = 0; i < 1000; i++) {      bh.consume(map.get(i % 100));    }  }
  @Benchmark  public void immutableMap(Blackhole bh) {    ImmutableMap.Builder<Integer, Integer> builder = ImmutableMap.builder();
    for (int i = 0; i < 100; i++) {      builder.put(i, i);    }    ImmutableMap<Integer, Integer> map = builder.build();    for (int i = 0; i < 1000; i++) {      bh.consume(map.get(i % 100));    }  }}