package com.vaadin.v7.data.util; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.SortedSet; import java.util.TreeSet; import org.junit.Assert; import org.junit.Test; public class PerformanceTestIndexedContainerTest { private static final int REPEATS = 10; private final static int ITEMS = 50000; private static final long ADD_ITEM_FAIL_THRESHOLD = 200; // TODO should improve performance of these methods private static final long ADD_ITEM_AT_FAIL_THRESHOLD = 5000; private static final long ADD_ITEM_AFTER_FAIL_THRESHOLD = 5000; // FIXME: Vaadin 7 compatibility version fails this check with original // value of 5000 private static final long ADD_ITEM_AFTER_LAST_FAIL_THRESHOLD = 6000; private static final long ADD_ITEMS_CONSTRUCTOR_FAIL_THRESHOLD = 200; @Test public void testAddItemPerformance() { Collection<Long> times = new ArrayList<Long>(); for (int j = 0; j < REPEATS; ++j) { IndexedContainer c = new IndexedContainer(); long start = System.currentTimeMillis(); for (int i = 0; i < ITEMS; i++) { c.addItem(); } times.add(System.currentTimeMillis() - start); } checkMedian(ITEMS, times, "IndexedContainer.addItem()", ADD_ITEM_FAIL_THRESHOLD); } @Test public void testAddItemAtPerformance() { Collection<Long> times = new ArrayList<Long>(); for (int j = 0; j < REPEATS; ++j) { IndexedContainer c = new IndexedContainer(); long start = System.currentTimeMillis(); for (int i = 0; i < ITEMS; i++) { c.addItemAt(0); } times.add(System.currentTimeMillis() - start); } checkMedian(ITEMS, times, "IndexedContainer.addItemAt()", ADD_ITEM_AT_FAIL_THRESHOLD); } @Test public void testAddItemAfterPerformance() { Object initialId = "Item0"; Collection<Long> times = new ArrayList<Long>(); for (int j = 0; j < REPEATS; ++j) { IndexedContainer c = new IndexedContainer(); c.addItem(initialId); long start = System.currentTimeMillis(); for (int i = 0; i < ITEMS; i++) { c.addItemAfter(initialId); } times.add(System.currentTimeMillis() - start); } checkMedian(ITEMS, times, "IndexedContainer.addItemAfter()", ADD_ITEM_AFTER_FAIL_THRESHOLD); } @Test public void testAddItemAfterLastPerformance() { // TODO running with less items because slow otherwise Collection<Long> times = new ArrayList<Long>(); for (int j = 0; j < REPEATS; ++j) { IndexedContainer c = new IndexedContainer(); c.addItem(); long start = System.currentTimeMillis(); for (int i = 0; i < ITEMS / 3; i++) { c.addItemAfter(c.lastItemId()); } times.add(System.currentTimeMillis() - start); } checkMedian(ITEMS / 3, times, "IndexedContainer.addItemAfter(lastId)", ADD_ITEM_AFTER_LAST_FAIL_THRESHOLD); } @Test public void testAddItemsConstructorPerformance() { Collection<Object> items = new ArrayList<Object>(50000); for (int i = 0; i < ITEMS; ++i) { items.add(new Object()); } SortedSet<Long> times = new TreeSet<Long>(); for (int j = 0; j < REPEATS; ++j) { long start = System.currentTimeMillis(); new IndexedContainer(items); times.add(System.currentTimeMillis() - start); } checkMedian(ITEMS, times, "IndexedContainer(Collection)", ADD_ITEMS_CONSTRUCTOR_FAIL_THRESHOLD); } private void checkMedian(int items, Collection<Long> times, String methodName, long threshold) { long median = median(times); System.out.println( methodName + " timings (ms) for " + items + " items: " + times); Assert.assertTrue(methodName + " too slow, median time " + median + "ms for " + items + " items", median <= threshold); } private Long median(Collection<Long> times) { ArrayList<Long> list = new ArrayList<Long>(times); Collections.sort(list); // not exact median in some cases, but good enough return list.get(list.size() / 2); } }