On Wed, Aug 15, 2018 at 01:18:23PM -0700, Jeff Gilbert wrote:
What are the pros/cons to mozilla::Hash{Map,Set} vs
std::unordered_{map,set}? I'm assuming perf is the main draw? Do we
have a data on this too?

According to our benchmarks, mozilla::HashMap is much faster than std::unordered_map. But that's not the reason you should use it instead.

The main reason you shouldn't use std::unordered_map is that it's not approved for use in mozilla-central (though it is on the whitelist, and marked as unreviewed). Beyond that, we have no control over the memory usage or performance characteristics of unordered_map or unordered_set, and no way to add memory reporters for them. Their performance and memory usage are likely to vary from system to system, and from STL version to STL version, without giving us any indication, unless we're lucky and spot a talos or AWSY regression that we don't have any easy way to track down.

On Mon, Aug 13, 2018 at 10:44 PM, Nicholas Nethercote
<n.netherc...@gmail.com> wrote:
Hi,

I recently moved Spidermonkey's js::Hash{Map,Set} classes from
js/public/HashTable.h into mfbt/HashTable.h and renamed them as
mozilla::Hash{Map,Set}. They can now be used throughout Gecko.

(js/public/HashTable.h still exists in order to provide renamings of
mozilla::Hash{Map,Set} as js::Hash{Map,Set}.)

Why might you use mozilla::Hash{Map,Set} instead of PLDHashTable (or
nsTHashtable and other descendants)?

- Better API: these types provide proper HashMap and HashSet instances, and
(in my opinion) are easier to use.

- Speed: the microbenchmark in xpcom/rust/gtest/bench-collections/Bench.cpp
shows that mozilla::HashSet is 2x or more faster than PLDHashTable. E.g.
compare "MozHash" against "PLDHash" in this graph:

https://treeherder.mozilla.org/perf.html#/graphs?timerange=604800&series=mozilla-central,1730159,1,6&series=mozilla-central,1730162,1,6&series=mozilla-central,1730164,1,6&series=mozilla-central,1732092,1,6&series=mozilla-central,1730163,1,6&series=mozilla-central,1730160,1,6

Bug 1477627 converted a hot hash table from PLDHashTable to
mozilla::HashSet and appears to have sped up cycle collection in some cases
by 7%. If you know of another PLDHashTable that is hot, it might be worth
converting it to mozilla::HashTable.

Both mozilla::Hash{Map,Set} and PLDHashTable use the same double-hashing
algorithm; the speed difference is due to mozilla::HashSet's extensive use
of templating and inlining. The downside of this is that mozilla::HashSet
will increase binary size more than PLDHashTable.

There are overview comments at the top of mfbt/HashTable.h, and the classes
themselves have more detailed comments about every method.

Nick
_______________________________________________
dev-platform mailing list
dev-platform@lists.mozilla.org
https://lists.mozilla.org/listinfo/dev-platform
_______________________________________________
dev-platform mailing list
dev-platform@lists.mozilla.org
https://lists.mozilla.org/listinfo/dev-platform

--
Kris Maglione
Senior Firefox Add-ons Engineer
Mozilla Corporation

First, solve the problem.  Then, write the code.
        --John Johnson

_______________________________________________
dev-platform mailing list
dev-platform@lists.mozilla.org
https://lists.mozilla.org/listinfo/dev-platform

Reply via email to