Bug 1389381: Part 3 - Loop over the entire set iterator when truncating a LimitedSet. r=aswan
authorKris Maglione <maglione.k@gmail.com>
Fri, 11 Aug 2017 14:46:44 -0700
changeset 374463 96fb5933d07336b44f19b77a511981cba96e29f3
parent 374462 364ef71685abd9959f7816810e422a15ec92087f
child 374464 8d96622625ba4ca26dfec0d9692fbb7fd18d7cc0
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 3 - Loop over the entire set iterator when truncating a LimitedSet. r=aswan MozReview-Commit-ID: 3imHF9IRI2N
toolkit/components/extensions/ExtensionUtils.jsm
--- a/toolkit/components/extensions/ExtensionUtils.jsm
+++ b/toolkit/components/extensions/ExtensionUtils.jsm
@@ -274,20 +274,24 @@ class LimitedSet extends Set {
   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;
+      // Live set iterators can ge relatively expensive, since they need
+      // to be updated after every modification to the set. Since
+      // breaking out of the loop early will keep the iterator alive
+      // until the next full GC, we're currently better off finishing
+      // the entire loop even after we're done truncating.
+      if (this.size > limit) {
+        this.delete(item);
       }
-      this.delete(item);
     }
   }
 
   add(item) {
     if (!this.has(item) && this.size >= this.limit + this.slop) {
       this.truncate(this.limit - 1);
     }
     super.add(item);