Benchmarks for TreeMap / SortedMap.
Patch by: jat, rovrevik (TBR-- someone other than scottb :P)
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@2326 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/test/com/google/gwt/emultest/java/util/SortedMapBenchmark.java b/user/test/com/google/gwt/emultest/java/util/SortedMapBenchmark.java
new file mode 100644
index 0000000..b80076c
--- /dev/null
+++ b/user/test/com/google/gwt/emultest/java/util/SortedMapBenchmark.java
@@ -0,0 +1,242 @@
+/*
+ * Copyright 2008 Google Inc.
+ *
+ * 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
+ *
+ * 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 com.google.gwt.emultest.java.util;
+
+import com.google.gwt.benchmarks.client.Benchmark;
+import com.google.gwt.benchmarks.client.IntRange;
+import com.google.gwt.benchmarks.client.Operator;
+import com.google.gwt.benchmarks.client.RangeEnum;
+import com.google.gwt.benchmarks.client.RangeField;
+import com.google.gwt.benchmarks.client.Setup;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.SortedMap;
+
+/**
+ * Benchmarks common operations on {@link SortedMap SortedMaps}. This test covers
+ * appends, inserts, and removes for various sizes and positions.
+ *
+ */
+public abstract class SortedMapBenchmark extends Benchmark {
+
+ /*
+ * TODO(rovrevik) Add more tests such as iteration, non-sequential random
+ * access, and sublists.
+ */
+
+ /**
+ * The various positions that data can be inserted into a list.
+ */
+ protected enum Position {
+
+ BEGIN("at the beginning"), EXPLICIT_END("explicitly at the end"), IMPLICIT_END(
+ "implicitly at the end"), VARIED("in varied locations");
+
+ private String label;
+
+ /**
+ * Constructor for <code>Position</code>.
+ *
+ * @param label a not <code>null</code> label describing this
+ * <code>Position</code>.
+ */
+ Position(String label) {
+ this.label = label;
+ }
+
+ /**
+ * Returns the textual description for the position.
+ *
+ * @return a not <code>null</code> description.
+ */
+ @Override
+ public String toString() {
+ return label;
+ }
+ }
+
+ private static final int PRIME = 3001;
+
+ protected final IntRange baseRange = new IntRange(512, Integer.MAX_VALUE,
+ Operator.MULTIPLY, 2);
+
+ protected final List<Position> explicitPositions = Arrays.asList(
+ Position.BEGIN, Position.EXPLICIT_END, Position.VARIED);
+
+ protected final IntRange insertRemoveRange = new IntRange(64,
+ Integer.MAX_VALUE, Operator.MULTIPLY, 2);
+
+ int index = 0;
+
+ SortedMap<Integer, String> sortedMap;
+
+ @Override
+ public String getModuleName() {
+ return "com.google.gwt.emultest.EmulSuite";
+ }
+
+ // Required for JUnit
+ public void testSortedMapGets() {
+ }
+
+ /**
+ * Performs <code>size</code> gets on a {@code SortedMap} of size,
+ * <code>size</code>.
+ *
+ * @param size the size of the {@code SortedMap}
+ */
+ @Setup("beginSortedMapGets")
+ public void testSortedMapGets(@RangeField("baseRange")
+ Integer size) {
+ int num = size.intValue();
+ for (int i = 0; i < num; i++) {
+ sortedMap.get(i);
+ }
+ }
+
+ // Required for JUnit
+ public void testSortedMapInserts() {
+ }
+
+ /**
+ * Performs <code>size</code> inserts at position, <code>where</code>, on
+ * an empty <code>SortedMap</code>.
+ *
+ * @param where Where the inserts happen
+ * @param size The size of the <code>SortedMap</code>
+ *
+ */
+ @Setup("beginSortedMapInserts")
+ public void testSortedMapInserts(@RangeEnum(Position.class)
+ Position where, @RangeField("insertRemoveRange")
+ Integer size) {
+ insertIntoCollection(size, where, sortedMap);
+ }
+
+ // Required for JUnit
+ public void testSortedMapPuts() {
+ }
+
+ /**
+ * Appends <code>size</code> items to an empty {@code SortedMap}.
+ *
+ * @param size the size of the {@code SortedMap}
+ */
+ @Setup("beginSortedMapPuts")
+ public void testSortedMapPuts(@RangeField("baseRange")
+ Integer size) {
+ int num = size.intValue();
+ for (int i = 0; i < num; i++) {
+ sortedMap.put(i, "hello");
+ }
+ }
+
+ // Required for JUnit
+ public void testSortedMapRemoves() {
+ }
+
+ /**
+ * Performs <code>size</code> removes at position, <code>where</code>, on
+ * an TreeMap of size, <code>size</code>.
+ *
+ * @param where Where the inserts happen
+ * @param size The size of the <code>SortedMap</code>
+ */
+ @Setup("beginSortedMapRemoves")
+ public void testSortedMapRemoves(@RangeField("explicitPositions")
+ Position where, @RangeField("insertRemoveRange")
+ Integer size) {
+ removeFromCollection(size, where, sortedMap);
+ }
+
+ /**
+ * Creates a new empty SortedMap.
+ *
+ * @return a not <code>null</code>, empty SortedMap
+ */
+ protected abstract SortedMap<Integer, String> newSortedMap();
+
+ void beginSortedMapGets(Integer size) {
+ createSortedMap(size);
+ }
+
+ void beginSortedMapInserts(Position where, Integer size) {
+ sortedMap = newSortedMap();
+ index = 0;
+ }
+
+ void beginSortedMapPuts(Integer size) {
+ sortedMap = newSortedMap();
+ }
+
+ void beginSortedMapRemoves(Position where, Integer size) {
+ beginSortedMapInserts(where, size);
+ testSortedMapInserts(where, size);
+ }
+
+ private void createSortedMap(Integer size) {
+ beginSortedMapPuts(size);
+ testSortedMapPuts(size);
+ }
+
+ private void insertIntoCollection(Integer size, Position where,
+ SortedMap<Integer, String> m) {
+ int num = size.intValue();
+ for (int i = 0; i < num; i++) {
+ if (where == Position.IMPLICIT_END) {
+ Integer key;
+ try {
+ key = m.lastKey();
+ } catch (NoSuchElementException e) {
+ key = Integer.valueOf(0);
+ }
+ m.put((key.intValue() + 1), "hello");
+ } else if (where == Position.BEGIN) {
+ m.put(0, "hello");
+ } else if (where == Position.EXPLICIT_END) {
+ m.put(m.size(), "hello");
+ } else if (where == Position.VARIED) {
+ m.put(index, "hello");
+ index += PRIME;
+ index %= m.size();
+ }
+ }
+ }
+
+ private int removeFromCollection(Integer size, Position where,
+ SortedMap<Integer, String> m) {
+ int num = size.intValue();
+ for (int i = 0; i < num; i++) {
+ if (where == Position.IMPLICIT_END) {
+ throw new RuntimeException("cannot remove from the end implicitly");
+ } else if (where == Position.BEGIN) {
+ m.remove(0);
+ } else if (where == Position.EXPLICIT_END) {
+ m.remove(m.size() - 1);
+ } else if (where == Position.VARIED) {
+ m.remove(index);
+ index += PRIME;
+ int currentSize = m.size();
+ if (currentSize > 0) {
+ index %= m.size();
+ }
+ }
+ }
+ return index;
+ }
+}
diff --git a/user/test/com/google/gwt/emultest/java/util/TreeMapBenchmark.java b/user/test/com/google/gwt/emultest/java/util/TreeMapBenchmark.java
new file mode 100644
index 0000000..15a57d8
--- /dev/null
+++ b/user/test/com/google/gwt/emultest/java/util/TreeMapBenchmark.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2008 Google Inc.
+ *
+ * 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
+ *
+ * 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 com.google.gwt.emultest.java.util;
+
+import java.util.SortedMap;
+import java.util.TreeMap;
+
+/**
+ * A {@link SortedMapBenchmark} for {@link TreeMap TreeMaps}.
+ */
+public class TreeMapBenchmark extends SortedMapBenchmark {
+ @Override
+ protected SortedMap<Integer, String> newSortedMap() {
+ return new TreeMap<Integer, String>();
+ }
+}