You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mahout.apache.org by ro...@apache.org on 2010/02/17 12:37:35 UTC
svn commit: r910925 -
/lucene/mahout/trunk/utils/src/main/java/org/apache/mahout/benchmark/VectorBenchmarks.java
Author: robinanil
Date: Wed Feb 17 11:37:34 2010
New Revision: 910925
URL: http://svn.apache.org/viewvc?rev=910925&view=rev
Log:
Better looking Benchmark output with comparison across impls
Modified:
lucene/mahout/trunk/utils/src/main/java/org/apache/mahout/benchmark/VectorBenchmarks.java
Modified: lucene/mahout/trunk/utils/src/main/java/org/apache/mahout/benchmark/VectorBenchmarks.java
URL: http://svn.apache.org/viewvc/lucene/mahout/trunk/utils/src/main/java/org/apache/mahout/benchmark/VectorBenchmarks.java?rev=910925&r1=910924&r2=910925&view=diff
==============================================================================
--- lucene/mahout/trunk/utils/src/main/java/org/apache/mahout/benchmark/VectorBenchmarks.java (original)
+++ lucene/mahout/trunk/utils/src/main/java/org/apache/mahout/benchmark/VectorBenchmarks.java Wed Feb 17 11:37:34 2010
@@ -18,8 +18,13 @@
package org.apache.mahout.benchmark;
import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.Random;
+import java.util.Map.Entry;
import org.apache.commons.cli2.CommandLine;
import org.apache.commons.cli2.Group;
@@ -29,7 +34,9 @@
import org.apache.commons.cli2.builder.DefaultOptionBuilder;
import org.apache.commons.cli2.builder.GroupBuilder;
import org.apache.commons.cli2.commandline.Parser;
+import org.apache.commons.lang.StringUtils;
import org.apache.mahout.common.CommandLineUtil;
+import org.apache.mahout.common.Summarizable;
import org.apache.mahout.common.TimingStatistics;
import org.apache.mahout.common.commandline.DefaultOptionCreator;
import org.apache.mahout.common.distance.CosineDistanceMeasure;
@@ -45,7 +52,7 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-public class VectorBenchmarks {
+public class VectorBenchmarks implements Summarizable {
private static final Logger log = LoggerFactory.getLogger(VectorBenchmarks.class);
private Vector[][] vectors;
private List<Vector> randomVectors = new ArrayList<Vector>();
@@ -53,6 +60,8 @@
private int numVectors;
private int loop;
private int opsPerUnit;
+ private Map<String,Integer> implType = new HashMap<String,Integer>();
+ private Map<String,List<String[]>> statsMap = new HashMap<String,List<String[]>>();
public VectorBenchmarks(int cardinality, int numVectors, int loop, int opsPerUnit) {
Random r = new Random();
@@ -72,14 +81,37 @@
}
- private void printStats(TimingStatistics stats, String methodName) {
- printStats(stats, methodName, 1);
+ private void printStats(TimingStatistics stats, String benchmarkName, String implName, String content) {
+ printStats(stats, benchmarkName, implName, content, 1);
}
- private void printStats(TimingStatistics stats, String methodName, int multiplier) {
- log.info("Create {} {} \nSpeed: {} UnitsProcessed/sec {} MBytes/sec ",
- new Object[] {methodName, stats.toString(), loop * numVectors * 1000000000.0f / stats.getSumTime(),
- multiplier * loop * numVectors * cardinality * 1000.0f * 12 / stats.getSumTime()});
+ private void printStats(TimingStatistics stats, String benchmarkName, String implName) {
+ printStats(stats, benchmarkName, implName, "", 1);
+ }
+
+ private void printStats(TimingStatistics stats,
+ String benchmarkName,
+ String implName,
+ String content,
+ int multiplier) {
+ float speed = multiplier * loop * numVectors * cardinality * 1000.0f * 12 / stats.getSumTime();
+ float opsPerSec = loop * numVectors * 1000000000.0f / stats.getSumTime();
+ log.info("{} {} \n{} {} \nSpeed: {} UnitsProcessed/sec {} MBytes/sec ",
+ new Object[] {benchmarkName, implName, content, stats.toString(), opsPerSec, speed});
+ String info = stats.toString().replaceAll("\n", "\t") + "\tSpeed = " + opsPerSec + " /sec\tRate = "
+ + speed + " MB/s";
+ if (implType.containsKey(implName) == false) {
+ implType.put(implName, implType.size());
+ }
+ int implId = implType.get(implName);
+ if (statsMap.containsKey(benchmarkName) == false) {
+ statsMap.put(benchmarkName, new ArrayList<String[]>());
+ }
+ List<String[]> implStats = statsMap.get(benchmarkName);
+ while (implStats.size() < implId + 1) {
+ implStats.add(new String[] {});
+ }
+ implStats.set(implId, info.split("\t"));
}
public void createBenchmark() {
@@ -90,7 +122,7 @@
vectors[0][i] = new DenseVector(randomVectors.get(i));
call.end();
}
- printStats(stats, "Create DenseVector");
+ printStats(stats, "Create", "DenseVector");
stats = new TimingStatistics();
for (int l = 0; l < loop; l++)
@@ -99,7 +131,7 @@
vectors[1][i] = new RandomAccessSparseVector(randomVectors.get(i));
call.end();
}
- printStats(stats, "Create RandomAccessSparseVector");
+ printStats(stats, "Create", "RandomAccessSparseVector");
stats = new TimingStatistics();
for (int l = 0; l < loop; l++)
@@ -108,7 +140,7 @@
vectors[2][i] = new SequentialAccessSparseVector(randomVectors.get(i));
call.end();
}
- printStats(stats, "Create SequentialAccessSparseVector");
+ printStats(stats, "Create", "SequentialAccessSparseVector");
}
@@ -120,7 +152,7 @@
vectors[0][i] = vectors[0][i].clone();
call.end();
}
- printStats(stats, "Clone DenseVector");
+ printStats(stats, "Clone", "DenseVector");
stats = new TimingStatistics();
for (int l = 0; l < loop; l++)
@@ -129,7 +161,7 @@
vectors[1][i] = vectors[1][i].clone();
call.end();
}
- printStats(stats, "Clone RandomAccessSparseVector");
+ printStats(stats, "Clone", "RandomAccessSparseVector");
stats = new TimingStatistics();
for (int l = 0; l < loop; l++)
@@ -138,7 +170,7 @@
vectors[2][i] = vectors[2][i].clone();
call.end();
}
- printStats(stats, "Clone SequentialAccessSparseVector");
+ printStats(stats, "Clone", "SequentialAccessSparseVector");
}
@@ -152,7 +184,7 @@
call.end();
}
// print result to prevent hotspot from eliminating deadcode
- printStats(stats, "DotProduct DenseVector sum = " + result + " ");
+ printStats(stats, "DotProduct", "DenseVector", "sum = " + result + " ");
stats = new TimingStatistics();
for (int l = 0; l < loop; l++)
@@ -162,7 +194,7 @@
call.end();
}
// print result to prevent hotspot from eliminating deadcode
- printStats(stats, "DotProduct RandomAccessSparseVector sum = " + result + " ");
+ printStats(stats, "DotProduct", "RandomAccessSparseVector", "sum = " + result + " ");
stats = new TimingStatistics();
for (int l = 0; l < loop; l++)
@@ -172,7 +204,7 @@
call.end();
}
// print result to prevent hotspot from eliminating deadcode
- printStats(stats, "DotProduct SequentialAccessSparseVector sum = " + result + " ");
+ printStats(stats, "DotProduct", "SequentialAccessSparseVector", "sum = " + result + " ");
}
@@ -191,8 +223,7 @@
call.end();
}
// print result to prevent hotspot from eliminating deadcode
- printStats(stats, "DistanceMeasure " + measure.getClass().getName() + " DenseVector minDistance = "
- + result + " ");
+ printStats(stats, measure.getClass().getName(), "DenseVector", "minDistance = " + result + " ");
stats = new TimingStatistics();
for (int l = 0; l < loop; l++)
@@ -207,8 +238,8 @@
call.end();
}
// print result to prevent hotspot from eliminating deadcode
- printStats(stats, "DistanceMeasure " + measure.getClass().getName()
- + " RandomAccessSparseVector minDistance = " + result + " ");
+ printStats(stats, measure.getClass().getName(), "RandomAccessSparseVector", "minDistance = " + result
+ + " ");
stats = new TimingStatistics();
for (int l = 0; l < loop; l++)
for (int i = 0; i < numVectors; i++) {
@@ -222,8 +253,8 @@
call.end();
}
// print result to prevent hotspot from eliminating deadcode
- printStats(stats, "DistanceMeasure " + measure.getClass().getName()
- + " SequentialAccessSparseVector minDistance = " + result + " ");
+ printStats(stats, measure.getClass().getName(), "SequentialAccessSparseVector", "minDistance = " + result
+ + " ");
}
@@ -273,7 +304,7 @@
numVectors = Integer.parseInt((String) cmdLine.getValue(numVectorsOpt));
}
- int loop = 200;
+ int loop = 2;
if (cmdLine.hasOption(loopOpt)) {
loop = Integer.parseInt((String) cmdLine.getValue(loopOpt));
@@ -292,10 +323,60 @@
mark.distanceMeasureBenchark(new EuclideanDistanceMeasure());
mark.distanceMeasureBenchark(new ManhattanDistanceMeasure());
mark.distanceMeasureBenchark(new TanimotoDistanceMeasure());
+
+ log.info("\n{}", mark.summarize());
} catch (OptionException e) {
CommandLineUtil.printHelp(group);
}
}
+ @Override
+ public String summarize() {
+ int pad = 30;
+ StringBuilder sb = new StringBuilder(1000);
+ sb.append(StringUtils.rightPad("BenchMarks", pad));
+ for (int i = 0; i < implType.size(); i++) {
+ for (Entry<String,Integer> e : implType.entrySet()) {
+ if (e.getValue().intValue() == i) {
+ sb.append(StringUtils.rightPad(e.getKey(), pad));
+ break;
+ }
+ }
+ }
+ sb.append("\n");
+ List<String> keys = new ArrayList<String>(statsMap.keySet());
+ Collections.sort(keys);
+ for (String benchmarkName : keys) {
+ List<String[]> implTokenizedStats = statsMap.get(benchmarkName);
+ int maxStats = 0;
+ for (String[] stat : implTokenizedStats) {
+ maxStats = Math.max(maxStats, stat.length);
+ }
+
+ for (int i = 0; i < maxStats; i++) {
+ boolean printedName = false;
+ for (int j = 0; j < implTokenizedStats.size(); j++) {
+ String[] stats = implTokenizedStats.get(j);
+ if (i == 0 && !printedName) {
+ sb.append(StringUtils.rightPad(benchmarkName, pad));
+ printedName = true;
+ } else if (!printedName) {
+ printedName = true;
+ sb.append(StringUtils.rightPad("", pad));
+ }
+ if (stats.length > i) {
+ sb.append(StringUtils.rightPad(stats[i], pad));
+ } else {
+ sb.append(StringUtils.rightPad("", pad));
+ }
+
+ }
+ sb.append("\n");
+ }
+ sb.append("\n");
+ }
+ return sb.toString();
+ }
+
}