Optimize stdout_spinner.update() methods so that they don't
authorZac Medico <zmedico@gentoo.org>
Fri, 2 Nov 2007 06:46:34 +0000 (06:46 -0000)
committerZac Medico <zmedico@gentoo.org>
Fri, 2 Nov 2007 06:46:34 +0000 (06:46 -0000)
waste cpu time by flushing output to the tty too frequently.
(trunk r8332)

svn path=/main/branches/2.1.2/; revision=8371

bin/emerge

index 1d0788f755255c60dd073571480a28186e999ef1..c75e3ef54d933c14a282f07acce8df224b95c1d9 100755 (executable)
@@ -91,9 +91,25 @@ class stdout_spinner(object):
                self.update = self.update_twirl
                self.scroll_sequence = self.scroll_msgs[
                        int(time.time() * 100) % len(self.scroll_msgs)]
+               self.last_update = 0
+               self.min_display_latency = 0.05
+
+       def _return_early(self):
+               """
+               Flushing ouput to the tty too frequently wastes cpu time. Therefore,
+               each update* method should return without doing any output when this
+               method returns True.
+               """
+               cur_time = time.time()
+               if cur_time - self.last_update < self.min_display_latency:
+                       return True
+               self.last_update = cur_time
+               return False
 
        def update_basic(self):
                self.spinpos = (self.spinpos + 1) % 500
+               if self._return_early():
+                       return
                if (self.spinpos % 100) == 0:
                        if self.spinpos == 0:
                                sys.stdout.write(". ")
@@ -102,6 +118,8 @@ class stdout_spinner(object):
                sys.stdout.flush()
 
        def update_scroll(self):
+               if self._return_early():
+                       return
                if(self.spinpos >= len(self.scroll_sequence)):
                        sys.stdout.write(darkgreen(" \b\b\b" + self.scroll_sequence[
                                len(self.scroll_sequence) - 1 - (self.spinpos % len(self.scroll_sequence))]))
@@ -112,6 +130,8 @@ class stdout_spinner(object):
 
        def update_twirl(self):
                self.spinpos = (self.spinpos + 1) % len(self.twirl_sequence)
+               if self._return_early():
+                       return
                sys.stdout.write("\b\b " + self.twirl_sequence[self.spinpos])
                sys.stdout.flush()
 
@@ -1280,9 +1300,6 @@ class depgraph:
                                        return 0
                                del e
 
-               if "--nodeps" not in self.myopts:
-                       self.spinner.update()
-
                reinstall_for_flags = None
                merging=1
                if mytype == "installed":
@@ -1439,6 +1456,8 @@ class depgraph:
                elif "recurse" not in self.myparams:
                        return 1
 
+               self.spinner.update()
+
                """ Check DEPEND/RDEPEND/PDEPEND/SLOT
                Pull from bintree if it's binary package, porttree if it's ebuild.
                Binpkg's can be either remote or local. """