While working on a memory benchmark of some high-throughput data structures, I realized I could use an ImmutableMap
with only a little refactoring.
Thinki
Some possible reasons:
Could that depend on your implementation of RndString.build()?
And have a look at the get() implementation of both maps: com.google.common.collect.RegularImmutableMap.get(Object) java.util.HashMap.getEntry(Object) java.util.HashMap tries to compare with "==" first. RegularImmutableMap doesn't. That may speed up
Could a different load factor be responsible for that? Perhaps the RegularImmutableMap needs more iterations to find the correct entry.
As Louis Wasserman said, ImmutableMap
is not optimized for objects with slow equals
method. I think the main difference is here:
HashMap:
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
return e.value;
ImmtubleMap:
if (key.equals(candidateKey)) {
return entry.getValue();
As you can see, to check for collisions, HashMap
first check the hashes. This allows to reject values with different hashes fast. Since String
doesn't make this check in its equals
method, this makes HashMap
faster. ImmutableMap
doesn't use this optimization because it would make the test slower when equals
is already optimized.