1 /* 2 * Copyright (C) 2013 Google Inc. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 * in compliance with the License. You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software distributed under the License 10 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 * or implied. See the License for the specific language governing permissions and limitations under 12 * the License. 13 */ 14 15 package com.google.caliper.runner; 16 17 import static org.junit.Assert.assertEquals; 18 19 import com.google.caliper.BeforeExperiment; 20 import com.google.caliper.Benchmark; 21 import com.google.caliper.config.VmConfig; 22 import com.google.caliper.model.Measurement; 23 import com.google.caliper.model.Trial; 24 import com.google.caliper.platform.Platform; 25 import com.google.caliper.platform.jvm.JvmPlatform; 26 import com.google.common.collect.ImmutableListMultimap; 27 import com.google.common.collect.ImmutableMap; 28 import com.google.common.collect.ImmutableSet; 29 import com.google.common.collect.Iterables; 30 import com.google.common.collect.Lists; 31 32 import org.junit.Rule; 33 import org.junit.Test; 34 import org.junit.runner.RunWith; 35 import org.junit.runners.JUnit4; 36 37 import java.io.File; 38 import java.util.List; 39 40 /** 41 * Tests {@link AllocationInstrument}. 42 */ 43 44 @RunWith(JUnit4.class) 45 public class AllocationInstrumentTest { 46 47 @Rule public CaliperTestWatcher runner = new CaliperTestWatcher(); 48 getExtraCommandLineArgs()49 @Test public void getExtraCommandLineArgs() throws Exception { 50 AllocationInstrument instrument = new AllocationInstrument(); 51 File fakeJar = File.createTempFile("fake", "jar"); 52 fakeJar.deleteOnExit(); 53 instrument.setOptions(ImmutableMap.of("allocationAgentJar", fakeJar.getAbsolutePath())); 54 ImmutableSet<String> expected = new ImmutableSet.Builder<String>() 55 .addAll(JvmPlatform.INSTRUMENT_JVM_ARGS) 56 .add("-Xint") 57 .add("-javaagent:" + fakeJar.getAbsolutePath()) 58 .add("-Xbootclasspath/a:" + fakeJar.getAbsolutePath()) 59 .add("-Dsun.reflect.inflationThreshold=0") 60 .build(); 61 Platform platform = new JvmPlatform(); 62 VmConfig vmConfig = new VmConfig.Builder(platform, new File(System.getProperty("java.home"))) 63 .build(); 64 assertEquals(expected, instrument.getExtraCommandLineArgs(vmConfig)); 65 fakeJar.delete(); 66 } 67 68 @Test intrinsics()69 public void intrinsics() throws Exception { 70 runner.forBenchmark(ArrayListGrowthBenchmark.class) 71 .instrument("allocation") 72 .run(); 73 Trial trial = Iterables.getOnlyElement(runner.trials()); 74 ImmutableListMultimap<String, Measurement> measurementsByDescription = 75 Measurement.indexByDescription(trial.measurements()); 76 // 14 objects and 1960 bytes are the known values for growing an ArrayList from 1 element to 100 77 // elements 78 for (Measurement objectMeasurement : measurementsByDescription.get("objects")) { 79 assertEquals(14.0, objectMeasurement.value().magnitude() / objectMeasurement.weight(), 0.001); 80 } 81 for (Measurement byteMeasurement : measurementsByDescription.get("bytes")) { 82 assertEquals(1960.0, byteMeasurement.value().magnitude() / byteMeasurement.weight(), 0.001); 83 } 84 } 85 86 public static class TestBenchmark { 87 List<Object> list = Lists.newLinkedList(); compressionSize(int reps)88 @Benchmark public int compressionSize(int reps) { 89 for (int i = 0; i < reps; i++) { 90 list.add(new Object()); 91 } 92 int hashCode = list.hashCode(); 93 list.clear(); 94 return hashCode; 95 } 96 } 97 98 public static class ArrayListGrowthBenchmark { warmUp()99 @BeforeExperiment void warmUp() { 100 // ensure that hotspot has compiled this code 101 benchmarkGrowth(100000); 102 } 103 benchmarkGrowth(int reps)104 @Benchmark void benchmarkGrowth(int reps) { 105 for (int i = 0; i < reps; i++) { 106 List<String> list = Lists.newArrayListWithCapacity(1); 107 for (int j = 0; j < 100; j++) { 108 list.add(""); 109 } 110 } 111 } 112 } 113 } 114