From 8d3e5e4c32f04d6e9cb8a5e1c36684426062e9d4 Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Fri, 2 Nov 2007 06:46:34 +0000 Subject: Optimize stdout_spinner.update() methods so that they don't waste cpu time by flushing output to the tty too frequently. (trunk r8332) svn path=/main/branches/2.1.2/; revision=8371 --- bin/emerge | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) (limited to 'bin') diff --git a/bin/emerge b/bin/emerge index 1d0788f75..c75e3ef54 100755 --- a/bin/emerge +++ b/bin/emerge @@ -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. """ -- cgit v1.2.3-1-g7c22