blob: fe8e3c925585a155e86047c6bbb985096824ac06 [file] [log] [blame]
/*
* 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.
*/
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;
/** 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) {
StringBuilder sb = new StringBuilder();
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();
StringBuilder sb = new StringBuilder();
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;
StringBuilder sb = new StringBuilder();
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);
}
}