| /** |
| * Copyright 2016 Google Inc. All Rights Reserved. |
| * |
| * <p>Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file |
| * except in compliance with the License. You may obtain a copy of the License at |
| * |
| * <p>http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * <p>Unless required by applicable law or agreed to in writing, software distributed under the |
| * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either |
| * express or implied. See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package com.android.vts.util; |
| |
| import com.android.vts.entity.ProfilingPointEntity; |
| import com.android.vts.entity.ProfilingPointSummaryEntity; |
| import com.google.appengine.api.datastore.Entity; |
| import java.util.Arrays; |
| import java.util.HashMap; |
| import java.util.Map; |
| import java.util.concurrent.TimeUnit; |
| import java.util.logging.Logger; |
| |
| /** PerformanceSummary, an object summarizing performance across profiling points for a test run. */ |
| public class PerformanceSummary { |
| protected static Logger logger = Logger.getLogger(PerformanceSummary.class.getName()); |
| private Map<String, ProfilingPointSummary> summaryMap; |
| |
| public final long startTime; |
| public final long endTime; |
| public final String label; |
| |
| /** Creates a performance summary object. */ |
| public PerformanceSummary(long startTime, long endTime, String label) { |
| this.summaryMap = new HashMap<>(); |
| this.startTime = startTime; |
| this.endTime = endTime; |
| this.label = label; |
| } |
| |
| /** Creates a performance summary object. */ |
| public PerformanceSummary(long startTime, long endTime) { |
| this( |
| startTime, |
| endTime, |
| "<span class='date-label'>" |
| + Long.toString(TimeUnit.MICROSECONDS.toMillis(endTime)) |
| + "</span>"); |
| } |
| |
| /** |
| * Determine if the performance summary contains the provided time. |
| * |
| * @param time The time (unix timestamp, microseconds) to check. |
| * @return True if the time is within the performance summary window, false otherwise. |
| */ |
| public boolean contains(long time) { |
| return time >= startTime && time <= endTime; |
| } |
| |
| /** |
| * Add the profiling data from a ProfilingPointRunEntity to the performance summary. |
| * |
| * @param profilingRun The Entity object whose data to add. |
| */ |
| public void addData(ProfilingPointEntity profilingPoint, Entity profilingRun) { |
| ProfilingPointSummaryEntity ppSummary = |
| ProfilingPointSummaryEntity.fromEntity(profilingRun); |
| if (ppSummary == null) return; |
| |
| String name = profilingPoint.getProfilingPointName(); |
| if (ppSummary.getLabels() != null && ppSummary.getLabels().size() > 0) { |
| if (!ppSummary.getSeries().equals("")) { |
| name += " (" + ppSummary.getSeries() + ")"; |
| } |
| if (!summaryMap.containsKey(name)) { |
| summaryMap.put( |
| name, |
| new ProfilingPointSummary( |
| profilingPoint.getXLabel(), |
| profilingPoint.getYLabel(), |
| profilingPoint.getVtsProfilingRegressionMode(profilingPoint.getRegressionMode()))); |
| } |
| summaryMap.get(name).update(ppSummary); |
| } else { |
| // Use the option suffix as the table name. |
| // Group all profiling points together into one table |
| if (!summaryMap.containsKey(ppSummary.getSeries())) { |
| summaryMap.put( |
| ppSummary.getSeries(), |
| new ProfilingPointSummary( |
| profilingPoint.getXLabel(), |
| profilingPoint.getYLabel(), |
| profilingPoint.getVtsProfilingRegressionMode(profilingPoint.getRegressionMode()))); |
| } |
| summaryMap.get(ppSummary.getSeries()).updateLabel(ppSummary, name); |
| } |
| } |
| |
| /** |
| * Adds a ProfilingPointSummary object into the summary map only if the key doesn't exist. |
| * |
| * @param key The name of the profiling point. |
| * @param summary The ProfilingPointSummary object to add into the summary map. |
| * @return True if the data was inserted into the performance summary, false otherwise. |
| */ |
| public boolean insertProfilingPointSummary(String key, ProfilingPointSummary summary) { |
| if (!summaryMap.containsKey(key)) { |
| summaryMap.put(key, summary); |
| return true; |
| } |
| return false; |
| } |
| |
| /** |
| * Gets the number of profiling points. |
| * |
| * @return The number of profiling points in the performance summary. |
| */ |
| public int size() { |
| return summaryMap.size(); |
| } |
| |
| /** |
| * Gets the names of the profiling points. |
| * |
| * @return A string array of profiling point names. |
| */ |
| public String[] getProfilingPointNames() { |
| String[] profilingNames = summaryMap.keySet().toArray(new String[summaryMap.size()]); |
| Arrays.sort(profilingNames); |
| return profilingNames; |
| } |
| |
| /** |
| * Determines if a profiling point is described by the performance summary. |
| * |
| * @param profilingPointName The name of the profiling point. |
| * @return True if the profiling point is contained in the performance summary, else false. |
| */ |
| public boolean hasProfilingPoint(String profilingPointName) { |
| return summaryMap.containsKey(profilingPointName); |
| } |
| |
| /** |
| * Gets the profiling point summary by name. |
| * |
| * @param profilingPointName The name of the profiling point to fetch. |
| * @return The ProfilingPointSummary object describing the specified profiling point. |
| */ |
| public ProfilingPointSummary getProfilingPointSummary(String profilingPointName) { |
| return summaryMap.get(profilingPointName); |
| } |
| } |