1 /** 2 * Copyright 2016 Google Inc. All Rights Reserved. 3 * 4 * <p>Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file 5 * except in compliance with the License. You may obtain a copy of the License at 6 * 7 * <p>http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * <p>Unless required by applicable law or agreed to in writing, software distributed under the 10 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 11 * express or implied. See the License for the specific language governing permissions and 12 * limitations under the License. 13 */ 14 package com.android.vts.util; 15 16 import com.android.vts.entity.ProfilingPointEntity; 17 import com.android.vts.entity.ProfilingPointSummaryEntity; 18 import com.google.appengine.api.datastore.Entity; 19 import java.util.Arrays; 20 import java.util.HashMap; 21 import java.util.Map; 22 import java.util.concurrent.TimeUnit; 23 import java.util.logging.Logger; 24 25 /** PerformanceSummary, an object summarizing performance across profiling points for a test run. */ 26 public class PerformanceSummary { 27 protected static Logger logger = Logger.getLogger(PerformanceSummary.class.getName()); 28 private Map<String, ProfilingPointSummary> summaryMap; 29 30 public final long startTime; 31 public final long endTime; 32 public final String label; 33 34 /** Creates a performance summary object. */ PerformanceSummary(long startTime, long endTime, String label)35 public PerformanceSummary(long startTime, long endTime, String label) { 36 this.summaryMap = new HashMap<>(); 37 this.startTime = startTime; 38 this.endTime = endTime; 39 this.label = label; 40 } 41 42 /** Creates a performance summary object. */ PerformanceSummary(long startTime, long endTime)43 public PerformanceSummary(long startTime, long endTime) { 44 this( 45 startTime, 46 endTime, 47 "<span class='date-label'>" 48 + Long.toString(TimeUnit.MICROSECONDS.toMillis(endTime)) 49 + "</span>"); 50 } 51 52 /** 53 * Determine if the performance summary contains the provided time. 54 * 55 * @param time The time (unix timestamp, microseconds) to check. 56 * @return True if the time is within the performance summary window, false otherwise. 57 */ contains(long time)58 public boolean contains(long time) { 59 return time >= startTime && time <= endTime; 60 } 61 62 /** 63 * Add the profiling data from a ProfilingPointRunEntity to the performance summary. 64 * 65 * @param profilingRun The Entity object whose data to add. 66 */ addData(ProfilingPointEntity profilingPoint, Entity profilingRun)67 public void addData(ProfilingPointEntity profilingPoint, Entity profilingRun) { 68 ProfilingPointSummaryEntity ppSummary = 69 ProfilingPointSummaryEntity.fromEntity(profilingRun); 70 if (ppSummary == null) return; 71 72 String name = profilingPoint.getProfilingPointName(); 73 if (ppSummary.getLabels() != null && ppSummary.getLabels().size() > 0) { 74 if (!ppSummary.getSeries().equals("")) { 75 name += " (" + ppSummary.getSeries() + ")"; 76 } 77 if (!summaryMap.containsKey(name)) { 78 summaryMap.put( 79 name, 80 new ProfilingPointSummary( 81 profilingPoint.getXLabel(), 82 profilingPoint.getYLabel(), 83 profilingPoint.getVtsProfilingRegressionMode(profilingPoint.getRegressionMode()))); 84 } 85 summaryMap.get(name).update(ppSummary); 86 } else { 87 // Use the option suffix as the table name. 88 // Group all profiling points together into one table 89 if (!summaryMap.containsKey(ppSummary.getSeries())) { 90 summaryMap.put( 91 ppSummary.getSeries(), 92 new ProfilingPointSummary( 93 profilingPoint.getXLabel(), 94 profilingPoint.getYLabel(), 95 profilingPoint.getVtsProfilingRegressionMode(profilingPoint.getRegressionMode()))); 96 } 97 summaryMap.get(ppSummary.getSeries()).updateLabel(ppSummary, name); 98 } 99 } 100 101 /** 102 * Adds a ProfilingPointSummary object into the summary map only if the key doesn't exist. 103 * 104 * @param key The name of the profiling point. 105 * @param summary The ProfilingPointSummary object to add into the summary map. 106 * @return True if the data was inserted into the performance summary, false otherwise. 107 */ insertProfilingPointSummary(String key, ProfilingPointSummary summary)108 public boolean insertProfilingPointSummary(String key, ProfilingPointSummary summary) { 109 if (!summaryMap.containsKey(key)) { 110 summaryMap.put(key, summary); 111 return true; 112 } 113 return false; 114 } 115 116 /** 117 * Gets the number of profiling points. 118 * 119 * @return The number of profiling points in the performance summary. 120 */ size()121 public int size() { 122 return summaryMap.size(); 123 } 124 125 /** 126 * Gets the names of the profiling points. 127 * 128 * @return A string array of profiling point names. 129 */ getProfilingPointNames()130 public String[] getProfilingPointNames() { 131 String[] profilingNames = summaryMap.keySet().toArray(new String[summaryMap.size()]); 132 Arrays.sort(profilingNames); 133 return profilingNames; 134 } 135 136 /** 137 * Determines if a profiling point is described by the performance summary. 138 * 139 * @param profilingPointName The name of the profiling point. 140 * @return True if the profiling point is contained in the performance summary, else false. 141 */ hasProfilingPoint(String profilingPointName)142 public boolean hasProfilingPoint(String profilingPointName) { 143 return summaryMap.containsKey(profilingPointName); 144 } 145 146 /** 147 * Gets the profiling point summary by name. 148 * 149 * @param profilingPointName The name of the profiling point to fetch. 150 * @return The ProfilingPointSummary object describing the specified profiling point. 151 */ getProfilingPointSummary(String profilingPointName)152 public ProfilingPointSummary getProfilingPointSummary(String profilingPointName) { 153 return summaryMap.get(profilingPointName); 154 } 155 } 156