Bug 1389381: Part 2 - Add slop to the maximum size of a LimitedSet. r?aswan
Truncating a Set can be relatively expensive, so truncating only after several
excessive entries have been added can save some cycles.
MozReview-Commit-ID: DIAXQ3ow2fa
--- a/toolkit/components/extensions/ExtensionUtils.jsm
+++ b/toolkit/components/extensions/ExtensionUtils.jsm
@@ -256,34 +256,43 @@ class EventEmitter {
return Promise.all(promises);
}
}
/**
* A set with a limited number of slots, which flushes older entries as
* newer ones are added.
+ *
+ * @param {integer} limit
+ * The maximum size to trim the set to after it grows too large.
+ * @param {integer} [slop = limit * .25]
+ * The number of extra entries to allow in the set after it
+ * reaches the size limit, before it is truncated to the limit.
+ * @param {iterable} [iterable]
+ * An iterable of initial entries to add to the set.
*/
class LimitedSet extends Set {
- constructor(limit, iterable = undefined) {
+ constructor(limit, slop = Math.round(limit * .25), iterable = undefined) {
super(iterable);
this.limit = limit;
+ this.slop = slop;
}
truncate(limit) {
for (let item of this) {
if (this.size <= limit) {
break;
}
this.delete(item);
}
}
add(item) {
- if (!this.has(item) && this.size >= this.limit) {
+ if (!this.has(item) && this.size >= this.limit + this.slop) {
this.truncate(this.limit - 1);
}
super.add(item);
}
}
/**
* Returns a Promise which resolves when the given document's DOM has