17dd252788645e940eada959bdde927426e2531c9Paul Duffin/*
27dd252788645e940eada959bdde927426e2531c9Paul Duffin * Copyright (C) 2012 The Guava Authors
37dd252788645e940eada959bdde927426e2531c9Paul Duffin *
47dd252788645e940eada959bdde927426e2531c9Paul Duffin * Licensed under the Apache License, Version 2.0 (the "License");
57dd252788645e940eada959bdde927426e2531c9Paul Duffin * you may not use this file except in compliance with the License.
67dd252788645e940eada959bdde927426e2531c9Paul Duffin * You may obtain a copy of the License at
77dd252788645e940eada959bdde927426e2531c9Paul Duffin *
87dd252788645e940eada959bdde927426e2531c9Paul Duffin * http://www.apache.org/licenses/LICENSE-2.0
97dd252788645e940eada959bdde927426e2531c9Paul Duffin *
107dd252788645e940eada959bdde927426e2531c9Paul Duffin * Unless required by applicable law or agreed to in writing, software
117dd252788645e940eada959bdde927426e2531c9Paul Duffin * distributed under the License is distributed on an "AS IS" BASIS,
127dd252788645e940eada959bdde927426e2531c9Paul Duffin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137dd252788645e940eada959bdde927426e2531c9Paul Duffin * See the License for the specific language governing permissions and
147dd252788645e940eada959bdde927426e2531c9Paul Duffin * limitations under the License.
157dd252788645e940eada959bdde927426e2531c9Paul Duffin */
167dd252788645e940eada959bdde927426e2531c9Paul Duffin
177dd252788645e940eada959bdde927426e2531c9Paul Duffinpackage com.google.common.collect;
187dd252788645e940eada959bdde927426e2531c9Paul Duffin
190888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.caliper.Benchmark;
207dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.caliper.Param;
217dd252788645e940eada959bdde927426e2531c9Paul Duffin
227dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.List;
237dd252788645e940eada959bdde927426e2531c9Paul Duffin
247dd252788645e940eada959bdde927426e2531c9Paul Duffin/**
257dd252788645e940eada959bdde927426e2531c9Paul Duffin * Benchmark for various ways to create an {@code ImmutableList}.
267dd252788645e940eada959bdde927426e2531c9Paul Duffin *
277dd252788645e940eada959bdde927426e2531c9Paul Duffin * @author Louis Wasserman
287dd252788645e940eada959bdde927426e2531c9Paul Duffin */
290888a09821a98ac0680fad765217302858e70fa4Paul Duffinpublic class ImmutableListCreationBenchmark {
307dd252788645e940eada959bdde927426e2531c9Paul Duffin
317dd252788645e940eada959bdde927426e2531c9Paul Duffin  @Param({"10", "1000", "1000000"})
327dd252788645e940eada959bdde927426e2531c9Paul Duffin  int size;
337dd252788645e940eada959bdde927426e2531c9Paul Duffin
347dd252788645e940eada959bdde927426e2531c9Paul Duffin  private static final Object OBJECT = new Object();
357dd252788645e940eada959bdde927426e2531c9Paul Duffin
360888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Benchmark int builderAdd(int reps) {
377dd252788645e940eada959bdde927426e2531c9Paul Duffin    int size = this.size;
387dd252788645e940eada959bdde927426e2531c9Paul Duffin    int dummy = 0;
397dd252788645e940eada959bdde927426e2531c9Paul Duffin    for (int rep = 0; rep < reps; rep++) {
407dd252788645e940eada959bdde927426e2531c9Paul Duffin      ImmutableList.Builder<Object> builder = ImmutableList.builder();
417dd252788645e940eada959bdde927426e2531c9Paul Duffin      for (int i = 0; i < size; i++) {
427dd252788645e940eada959bdde927426e2531c9Paul Duffin        builder.add(OBJECT);
437dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
447dd252788645e940eada959bdde927426e2531c9Paul Duffin      dummy += builder.build().size();
457dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
467dd252788645e940eada959bdde927426e2531c9Paul Duffin    return dummy;
477dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
487dd252788645e940eada959bdde927426e2531c9Paul Duffin
490888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Benchmark int preSizedBuilderAdd(int reps) {
507dd252788645e940eada959bdde927426e2531c9Paul Duffin    int size = this.size;
517dd252788645e940eada959bdde927426e2531c9Paul Duffin    int dummy = 0;
527dd252788645e940eada959bdde927426e2531c9Paul Duffin    for (int rep = 0; rep < reps; rep++) {
537dd252788645e940eada959bdde927426e2531c9Paul Duffin      ImmutableList.Builder<Object> builder = new ImmutableList.Builder<Object>(size);
547dd252788645e940eada959bdde927426e2531c9Paul Duffin      for (int i = 0; i < size; i++) {
557dd252788645e940eada959bdde927426e2531c9Paul Duffin        builder.add(OBJECT);
567dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
577dd252788645e940eada959bdde927426e2531c9Paul Duffin      dummy += builder.build().size();
587dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
597dd252788645e940eada959bdde927426e2531c9Paul Duffin    return dummy;
607dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
617dd252788645e940eada959bdde927426e2531c9Paul Duffin
620888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Benchmark int copyArrayList(int reps) {
637dd252788645e940eada959bdde927426e2531c9Paul Duffin    int size = this.size;
647dd252788645e940eada959bdde927426e2531c9Paul Duffin    int dummy = 0;
657dd252788645e940eada959bdde927426e2531c9Paul Duffin    for (int rep = 0; rep < reps; rep++) {
667dd252788645e940eada959bdde927426e2531c9Paul Duffin      List<Object> builder = Lists.newArrayList();
677dd252788645e940eada959bdde927426e2531c9Paul Duffin      for (int i = 0; i < size; i++) {
687dd252788645e940eada959bdde927426e2531c9Paul Duffin        builder.add(OBJECT);
697dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
707dd252788645e940eada959bdde927426e2531c9Paul Duffin      dummy += ImmutableList.copyOf(builder).size();
717dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
727dd252788645e940eada959bdde927426e2531c9Paul Duffin    return dummy;
737dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
747dd252788645e940eada959bdde927426e2531c9Paul Duffin
750888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Benchmark int copyPreSizedArrayList(int reps) {
767dd252788645e940eada959bdde927426e2531c9Paul Duffin    int size = this.size;
777dd252788645e940eada959bdde927426e2531c9Paul Duffin    int tmp = 0;
787dd252788645e940eada959bdde927426e2531c9Paul Duffin    for (int rep = 0; rep < reps; rep++) {
797dd252788645e940eada959bdde927426e2531c9Paul Duffin      List<Object> builder = Lists.newArrayListWithCapacity(size);
807dd252788645e940eada959bdde927426e2531c9Paul Duffin      for (int i = 0; i < size; i++) {
817dd252788645e940eada959bdde927426e2531c9Paul Duffin        builder.add(OBJECT);
827dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
837dd252788645e940eada959bdde927426e2531c9Paul Duffin      tmp += ImmutableList.copyOf(builder).size();
847dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
857dd252788645e940eada959bdde927426e2531c9Paul Duffin    return tmp;
867dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
877dd252788645e940eada959bdde927426e2531c9Paul Duffin}
88