Bug 1389381: Part 2 - Add slop to the maximum size of a LimitedSet. r=aswan
authorKris Maglione <maglione.k@gmail.com>
Sat, 12 Aug 2017 11:08:35 -0700
changeset 374462 364ef71685abd9959f7816810e422a15ec92087f
parent 374461 4b63f0f44148519df73c725ab99746d4d686e12f
child 374463 96fb5933d07336b44f19b77a511981cba96e29f3
push id32327
push userarchaeopteryx@coole-files.de
push dateSun, 13 Aug 2017 23:30:48 +0000
treeherdermozilla-central@3bfcbdf5c6c3 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersaswan
bugs1389381
milestone57.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
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
toolkit/components/extensions/ExtensionUtils.jsm
--- 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