package org.apache.lucene.benchmark.byTask.tasks; import java.util.LinkedHashMap; import org.apache.lucene.benchmark.byTask.PerfRunData; import org.apache.lucene.benchmark.byTask.stats.Report; import org.apache.lucene.benchmark.byTask.stats.TaskStats; import org.apache.lucene.benchmark.byTask.utils.Format; /** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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 * * http://www.apache.org/licenses/LICENSE-2.0 * * 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. */ /** * Report (abstract) task - all report tasks extend this task. */ public abstract class ReportTask extends PerfTask { public ReportTask(PerfRunData runData) { super(runData); } /* (non-Javadoc) * @see PerfTask#shouldNeverLogAtStart() */ @Override protected boolean shouldNeverLogAtStart() { return true; } /* (non-Javadoc) * @see PerfTask#shouldNotRecordStats() */ @Override protected boolean shouldNotRecordStats() { return true; } /* * From here start the code used to generate the reports. * Subclasses would use this part to generate reports. */ protected static final String newline = System.getProperty("line.separator"); /** * Get a textual summary of the benchmark results, average from all test runs. */ protected static final String OP = "Operation "; protected static final String ROUND = " round"; protected static final String RUNCNT = " runCnt"; protected static final String RECCNT = " recsPerRun"; protected static final String RECSEC = " rec/s"; protected static final String ELAPSED = " elapsedSec"; protected static final String USEDMEM = " avgUsedMem"; protected static final String TOTMEM = " avgTotalMem"; protected static final String COLS[] = { RUNCNT, RECCNT, RECSEC, ELAPSED, USEDMEM, TOTMEM }; /** * Compute a title line for a report table * @param longestOp size of longest op name in the table * @return the table title line. */ protected String tableTitle (String longestOp) { StringBuffer sb = new StringBuffer(); sb.append(Format.format(OP,longestOp)); sb.append(ROUND); sb.append(getRunData().getConfig().getColsNamesForValsByRound()); for (int i = 0; i < COLS.length; i++) { sb.append(COLS[i]); } return sb.toString(); } /** * find the longest op name out of completed tasks. * @param taskStats completed tasks to be considered. * @return the longest op name out of completed tasks. */ protected String longestOp(Iterable<TaskStats> taskStats) { String longest = OP; for (final TaskStats stat : taskStats) { if (stat.getElapsed()>=0) { // consider only tasks that ended String name = stat.getTask().getName(); if (name.length() > longest.length()) { longest = name; } } } return longest; } /** * Compute a report line for the given task stat. * @param longestOp size of longest op name in the table. * @param stat task stat to be printed. * @return the report line. */ protected String taskReportLine(String longestOp, TaskStats stat) { PerfTask task = stat.getTask(); StringBuffer sb = new StringBuffer(); sb.append(Format.format(task.getName(), longestOp)); String round = (stat.getRound()>=0 ? ""+stat.getRound() : "-"); sb.append(Format.formatPaddLeft(round, ROUND)); sb.append(getRunData().getConfig().getColsValuesForValsByRound(stat.getRound())); sb.append(Format.format(stat.getNumRuns(), RUNCNT)); sb.append(Format.format(stat.getCount() / stat.getNumRuns(), RECCNT)); long elapsed = (stat.getElapsed()>0 ? stat.getElapsed() : 1); // assume at least 1ms sb.append(Format.format(2, (float) (stat.getCount() * 1000.0 / elapsed), RECSEC)); sb.append(Format.format(2, (float) stat.getElapsed() / 1000, ELAPSED)); sb.append(Format.format(0, (float) stat.getMaxUsedMem() / stat.getNumRuns(), USEDMEM)); sb.append(Format.format(0, (float) stat.getMaxTotMem() / stat.getNumRuns(), TOTMEM)); return sb.toString(); } protected Report genPartialReport(int reported, LinkedHashMap<String,TaskStats> partOfTasks, int totalSize) { String longetOp = longestOp(partOfTasks.values()); boolean first = true; StringBuffer sb = new StringBuffer(); sb.append(tableTitle(longetOp)); sb.append(newline); int lineNum = 0; for (final TaskStats stat : partOfTasks.values()) { if (!first) { sb.append(newline); } first = false; String line = taskReportLine(longetOp,stat); lineNum++; if (partOfTasks.size()>2 && lineNum%2==0) { line = line.replaceAll(" "," - "); } sb.append(line); int[] byTime = stat.getCountsByTime(); if (byTime != null) { sb.append(newline); int end = -1; for(int i=byTime.length-1;i>=0;i--) { if (byTime[i] != 0) { end = i; break; } } if (end != -1) { sb.append(" by time:"); for(int i=0;i<end;i++) { sb.append(' ').append(byTime[i]); } } } } String reptxt = (reported==0 ? "No Matching Entries Were Found!" : sb.toString()); return new Report(reptxt,partOfTasks.size(),reported,totalSize); } }