diff --git a/test/Memory.java b/test/Memory.java new file mode 100644 index 0000000000..5c4997627b --- /dev/null +++ b/test/Memory.java @@ -0,0 +1,170 @@ +import java.util.Collection; +import java.util.Comparator; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.TreeSet; + +public class Memory { + private static final int ITERATION_COUNT=3; + + private static class Item { + private static int instanceCount=0; + private final int index; + private final int val; + public Item(int i) { val = i; index = instanceCount++; } + public int value() { return val; } + public int index() { return index; } + } + + private static void traceFunc(String s) { + if (false) { + System.out.println(s); + } + } + + private static void expect(boolean v) { + if (! v) throw new RuntimeException(); + } + + private static int runningSum(Item[] items) { + int sum=0; + for (Item item : items) { + sum += item.value(); + } + return sum; + } + + private static int runningSum(Collection items) { + int sum=0; + for (Item item : items) { + sum += item.value(); + } + return sum; + } + + private static final void testArray() { + traceFunc("testArray()"); + Item[] items = new Item[1750]; + + for (int iter=1; iter < ITERATION_COUNT; iter++) { + for (int i=0; i < 1000; i++) { + items[i] = new Item(1); + } + for (int i=0; i < 500; i++) { + items[i+1000] = new Item(4); + } + for (int i=0; i < 250; i++) { + items[i+1500] = new Item(9); + } + expect(runningSum(items) == (1000*1 + 500*4 + 250*9)); + Item[] zeroItems = new Item[300]; + for (int i=0; i < 300; i++) { + zeroItems[i] = new Item(0); + } + System.arraycopy(zeroItems, 0, items, 900, zeroItems.length); + for (int i=0; i < 10000; i++) { + items[0] = new Item(1); + } + expect(runningSum(items) == (900*1 + 300*4 + 250*9)); + for (int i=0; i < 300; i++) { + zeroItems[i] = new Item((i+900) < 1000 ? 1 : 4); + } + for (int i=0; i < 10000; i++) { + items[0] = new Item(1); + } + expect(runningSum(items) == (900*1 + 300*4 + 250*9)); + System.arraycopy(zeroItems, 0, items, 900, zeroItems.length); + expect(runningSum(items) == (1000*1 + 500*4 + 250*9)); + for (int i=0; i < 1750; i++) { + items[i] = null; + } + } + } + + private static final void testHashMap() { + traceFunc("testHashMap()"); + HashMap items = new HashMap(); + for (int iter=1; iter < ITERATION_COUNT; iter++) { + for (int i=0; i < 1000; i++) { + items.put(i, new Item(1)); + } + for (int i=0; i < 500; i++) { + items.put(i+1000, new Item(4)); + } + for (int i=0; i < 250; i++) { + items.put(i+1500, new Item(9)); + } + expect(runningSum(items.values()) == (1000*1 + 500*4 + 250*9)); + for (int i = 900; i < 1200; i++) { + items.remove(i); + } + expect(runningSum(items.values()) == (900*1 + 300*4 + 250*9)); + for (int i = 900; i < 1200; i++) { + items.put(i, new Item(i < 1000 ? 1 : 4)); + } + expect(runningSum(items.values()) == (1000*1 + 500*4 + 250*9)); + items.clear(); + } + } + + private static final void testLinkedList() { + traceFunc("testLinkedList()"); + LinkedList items = new LinkedList(); + for (int iter=1; iter < ITERATION_COUNT; iter++) { + for (int i=0; i < 1000; i++) { + items.add(new Item(1)); + } + for (int i=0; i < 500; i++) { + items.add(new Item(4)); + } + for (int i=0; i < 250; i++) { + items.add(new Item(9)); + } + expect(runningSum(items) == (1000*1 + 500*4 + 250*9)); + for (int i = 1199; i >= 900; i--) { + items.remove(i); + } + expect(runningSum(items) == (900*1 + 300*4 + 250*9)); + for (int i = 900; i < 1200; i++) { + items.add(new Item(i < 1000 ? 1 : 4)); + } + expect(runningSum(items) == (1000*1 + 500*4 + 250*9)); + items.clear(); + } + } + + private static final void testTreeSet() { + traceFunc("testTreeSet()"); + TreeSet items = new TreeSet(new Comparator() { + public int compare(Item i1, Item i2) { + int r = i1.value() - i2.value(); + if (r == 0) { + return i1.index() - i2.index(); + } + return r; + } + }); + for (int iter=1; iter < ITERATION_COUNT; iter++) { + for (int i=0; i < 1000; i++) { + items.add(new Item(1)); + } + for (int i=0; i < 500; i++) { + items.add(new Item(4)); + } + for (int i=0; i < 250; i++) { + items.add(new Item(9)); + } + expect(runningSum(items) == (1000*1 + 500*4 + 250*9)); + items.clear(); + } + } + + public static void main(String args[]) { + for (int i=0; i < 10; i++) { + testArray(); + testHashMap(); + testLinkedList(); + testTreeSet(); + } + } +}