Hi,
I added a couple of tests to check performance:
private static int LOAD_COUNT = 10000;
@Test
public void pivotHashMapSpeedTest() {
HashMap<String, String> map = new HashMap<String, String>();
for (int i = 0; i < LOAD_COUNT; i++) {
map.put(String.valueOf(i), String.valueOf(i));
}
}
@Test
public void javaHashMapSpeedTest() {
java.util.HashMap<String, String> map =
newjava.util.HashMap<String, String>();
for (int i = 0; i < LOAD_COUNT; i++) {
map.put(String.valueOf(i), String.valueOf(i));
}
}
Running inside Eclipse with the standard JUnit runner and whatever the
default heap size is, average over 3 runs:
1000
- Java = 0.008s
- Pivot = 0.033s
10000
- Java = 0.014s
- Pivot = 0.156s
100000
- Java = 0.113s
- Pivot = Out of Memory Error after 8.140s
I then changed the tests to:
@Test
public void pivotHashMapSpeedTest() {
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i = 0; i < LOAD_COUNT; i++) {
map.put(Integer.valueOf(i), Integer.valueOf(i));
}
}
@Test
public void javaHashMapSpeedTest() {
java.util.HashMap<Integer, Integer> map =
newjava.util.HashMap<Integer, Integer>();
for (int i = 0; i < LOAD_COUNT; i++) {
map.put(Integer.valueOf(i), Integer.valueOf(i));
}
}
And got the same relative results - though Integers were slightly faster
than Strings.
The stack trace for the memory error:
java.lang.OutOfMemoryError: Java heap space
at org.apache.pivot.collections.ArrayList.<init>(ArrayList.java:77)
at org.apache.pivot.collections.HashMap.rehash(HashMap.java:273)
at org.apache.pivot.collections.HashMap.put(HashMap.java:183)
at
org.apache.pivot.collections.test.HashMapTest.pivotHashMapSpeedTest(HashMapTest.java:147)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at
org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethodRunner.java:99)
at
org.junit.internal.runners.TestMethodRunner.runUnprotected(TestMethodRunner.java:81)
at
org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
at
org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75)
at org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45)
at
org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:66)
at
org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35)
at
org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
at
org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
at
org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:45)
at
org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Finally, I changed the HashMap to use LinkedList for the buckets instead of
ArrayList which gives an Out of Memory Error after 171.527s, though I only
ran this once.
Cheers,
Chris
2009/8/25 Sandro Martini <[email protected]>
> Hi to all,
> one time the HashMap implementation will be "stable", what do you
> think on adding also a LinkedHashMap implementation (an HashMap that
> it's usable also as a LinkedList), like in standard Collections ?
> It has a little overhead but in many cases it's useful.
>
> For the moment, thanks for the current work.
>
> Sandro
>