All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] perf/ui/tui: don't force a refresh during progress update
@ 2013-10-23 21:59 Patrick Palka
  2013-10-25 10:34 ` Ingo Molnar
  2013-10-26  0:25 ` [PATCH rebase] " Patrick Palka
  0 siblings, 2 replies; 5+ messages in thread
From: Patrick Palka @ 2013-10-23 21:59 UTC (permalink / raw)
  To: linux-kernel; +Cc: Peter Zijlstra, Paul Mackerras, Ingo Molnar

Each call to tui_progress__update() would forcibly refresh the entire
screen.  This is somewhat inefficient and causes noticable flickering
during the startup of perf-report, especially on large/slow terminals.

It looks like the force-refresh in tui_progress__update() serves no
purpose other than to clear the screen so that the progress bar of a
previous operation does not subsume with that of a subsequent operation.
But we can do just that in a much more efficient manner by clearing only
the region that a previous progress bar may have occupied before
repainting the new progress bar.  Then the force-refresh could be
removed with no change in visuals.

This patch disables the slow force-refresh in tui_progress__update() and
instead calls SLsmg_fill_region() on the entire area that the progress
bar may occupy before repainting it.  This change makes the startup of
perf-report much faster and appear much "smoother".

It turns out that this was a big bottleneck in the startup speed of
perf-report -- with this patch, perf-report starts up ~1.6x faster (0.8s
vs 0.5s) on my machines.  (These numbers were measured by running "time
perf report" on an 8MB perf.data and pressing 'q' immediately.)

Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Ingo Molnar <mingo@redhat.com>
Signed-off-by: Patrick Palka <patrick@parcs.ath.cx>
---
 tools/perf/ui/tui/progress.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/tools/perf/ui/tui/progress.c b/tools/perf/ui/tui/progress.c
index 6c2184d..641049a 100644
--- a/tools/perf/ui/tui/progress.c
+++ b/tools/perf/ui/tui/progress.c
@@ -17,13 +17,14 @@ static void tui_progress__update(u64 curr, u64 total, const char *title)
 	if (total == 0)
 		return;
 
-	ui__refresh_dimensions(true);
+	ui__refresh_dimensions(false);
 	pthread_mutex_lock(&ui__lock);
 	y = SLtt_Screen_Rows / 2 - 2;
 	SLsmg_set_color(0);
 	SLsmg_draw_box(y, 0, 3, SLtt_Screen_Cols);
 	SLsmg_gotorc(y++, 1);
 	SLsmg_write_string((char *)title);
+	SLsmg_fill_region(y, 1, 1, SLtt_Screen_Cols - 2, ' ');
 	SLsmg_set_color(HE_COLORSET_SELECTED);
 	bar = ((SLtt_Screen_Cols - 2) * curr) / total;
 	SLsmg_fill_region(y, 1, 1, bar, ' ');
-- 
1.8.4.rc3


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH] perf/ui/tui: don't force a refresh during progress update
  2013-10-23 21:59 [PATCH] perf/ui/tui: don't force a refresh during progress update Patrick Palka
@ 2013-10-25 10:34 ` Ingo Molnar
  2013-10-26  0:25 ` [PATCH rebase] " Patrick Palka
  1 sibling, 0 replies; 5+ messages in thread
From: Ingo Molnar @ 2013-10-25 10:34 UTC (permalink / raw)
  To: Patrick Palka; +Cc: linux-kernel, Peter Zijlstra, Paul Mackerras, Ingo Molnar


* Patrick Palka <patrick@parcs.ath.cx> wrote:

> Each call to tui_progress__update() would forcibly refresh the entire
> screen.  This is somewhat inefficient and causes noticable flickering
> during the startup of perf-report, especially on large/slow terminals.
> 
> It looks like the force-refresh in tui_progress__update() serves no
> purpose other than to clear the screen so that the progress bar of a
> previous operation does not subsume with that of a subsequent operation.
> But we can do just that in a much more efficient manner by clearing only
> the region that a previous progress bar may have occupied before
> repainting the new progress bar.  Then the force-refresh could be
> removed with no change in visuals.
> 
> This patch disables the slow force-refresh in tui_progress__update() and
> instead calls SLsmg_fill_region() on the entire area that the progress
> bar may occupy before repainting it.  This change makes the startup of
> perf-report much faster and appear much "smoother".
> 
> It turns out that this was a big bottleneck in the startup speed of
> perf-report -- with this patch, perf-report starts up ~1.6x faster (0.8s
> vs 0.5s) on my machines.  (These numbers were measured by running "time
> perf report" on an 8MB perf.data and pressing 'q' immediately.)
> 
> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
> Cc: Paul Mackerras <paulus@samba.org>
> Cc: Ingo Molnar <mingo@redhat.com>
> Signed-off-by: Patrick Palka <patrick@parcs.ath.cx>
> ---
>  tools/perf/ui/tui/progress.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/tools/perf/ui/tui/progress.c b/tools/perf/ui/tui/progress.c
> index 6c2184d..641049a 100644
> --- a/tools/perf/ui/tui/progress.c
> +++ b/tools/perf/ui/tui/progress.c
> @@ -17,13 +17,14 @@ static void tui_progress__update(u64 curr, u64 total, const char *title)
>  	if (total == 0)
>  		return;
>  
> -	ui__refresh_dimensions(true);
> +	ui__refresh_dimensions(false);
>  	pthread_mutex_lock(&ui__lock);
>  	y = SLtt_Screen_Rows / 2 - 2;
>  	SLsmg_set_color(0);
>  	SLsmg_draw_box(y, 0, 3, SLtt_Screen_Cols);
>  	SLsmg_gotorc(y++, 1);
>  	SLsmg_write_string((char *)title);
> +	SLsmg_fill_region(y, 1, 1, SLtt_Screen_Cols - 2, ' ');
>  	SLsmg_set_color(HE_COLORSET_SELECTED);
>  	bar = ((SLtt_Screen_Cols - 2) * curr) / total;
>  	SLsmg_fill_region(y, 1, 1, bar, ' ');

Nice! This is something I noticed as well, never figured out the 
root cause of it.

Acked-by: Ingo Molnar <mingo@kernel.org>

Thanks,

	Ingo

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH rebase] perf/ui/tui: don't force a refresh during progress update
  2013-10-23 21:59 [PATCH] perf/ui/tui: don't force a refresh during progress update Patrick Palka
  2013-10-25 10:34 ` Ingo Molnar
@ 2013-10-26  0:25 ` Patrick Palka
  2013-10-28  5:52   ` Namhyung Kim
  2013-11-12 21:54   ` [tip:perf/urgent] perf ui tui progress: Don' t " tip-bot for Patrick Palka
  1 sibling, 2 replies; 5+ messages in thread
From: Patrick Palka @ 2013-10-26  0:25 UTC (permalink / raw)
  To: linux-kernel
  Cc: Peter Zijlstra, Paul Mackerras, Arnaldo Carvalho de Melo,
	Namhyung Kim, Ingo Molnar

Each call to tui_progress__update() would forcibly refresh the entire
screen.  This is somewhat inefficient and causes noticable flickering
during the startup of perf-report, especially on large/slow terminals.

It looks like the force-refresh in tui_progress__update() serves no
purpose other than to clear the screen so that the progress bar of a
previous operation does not subsume that of a subsequent operation.
But we can do just that in a much more efficient manner by clearing only
the region that a previous progress bar may have occupied before
repainting the new progress bar.  Then the force-refresh could be
removed with no change in visuals.

This patch disables the slow force-refresh in tui_progress__update() and
instead calls SLsmg_fill_region() on the entire area that the progress
bar may occupy before repainting it.  This change makes the startup of
perf-report much faster and appear much "smoother".

It turns out that this was a big bottleneck in the startup speed of
perf-report -- with this patch, perf-report starts up ~2x faster (1.1s
vs 0.55s) on my machines.  (These numbers were measured by running
"time perf report" on an 8MB perf.data and pressing 'q' immediately.)

Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Ingo Molnar <mingo@kernel.org>
Acked-by: Ingo Molnar <mingo@kernel.org>
Signed-off-by: Patrick Palka <patrick@parcs.ath.cx>
---
Rebased against
  git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git perf/core

And also CC'd two more relevant persons.

 tools/perf/ui/tui/progress.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/tools/perf/ui/tui/progress.c b/tools/perf/ui/tui/progress.c
index 3e2d936..c61d14b 100644
--- a/tools/perf/ui/tui/progress.c
+++ b/tools/perf/ui/tui/progress.c
@@ -18,13 +18,14 @@ static void tui_progress__update(struct ui_progress *p)
 	if (p->total == 0)
 		return;
 
-	ui__refresh_dimensions(true);
+	ui__refresh_dimensions(false);
 	pthread_mutex_lock(&ui__lock);
 	y = SLtt_Screen_Rows / 2 - 2;
 	SLsmg_set_color(0);
 	SLsmg_draw_box(y, 0, 3, SLtt_Screen_Cols);
 	SLsmg_gotorc(y++, 1);
 	SLsmg_write_string((char *)p->title);
+	SLsmg_fill_region(y, 1, 1, SLtt_Screen_Cols - 2, ' ');
 	SLsmg_set_color(HE_COLORSET_SELECTED);
 	bar = ((SLtt_Screen_Cols - 2) * p->curr) / p->total;
 	SLsmg_fill_region(y, 1, 1, bar, ' ');
-- 
1.8.4.rc3


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH rebase] perf/ui/tui: don't force a refresh during progress update
  2013-10-26  0:25 ` [PATCH rebase] " Patrick Palka
@ 2013-10-28  5:52   ` Namhyung Kim
  2013-11-12 21:54   ` [tip:perf/urgent] perf ui tui progress: Don' t " tip-bot for Patrick Palka
  1 sibling, 0 replies; 5+ messages in thread
From: Namhyung Kim @ 2013-10-28  5:52 UTC (permalink / raw)
  To: Patrick Palka
  Cc: linux-kernel, Peter Zijlstra, Paul Mackerras,
	Arnaldo Carvalho de Melo, Ingo Molnar

Hi Patrick,

On Fri, 25 Oct 2013 20:25:49 -0400, Patrick Palka wrote:
> Each call to tui_progress__update() would forcibly refresh the entire
> screen.  This is somewhat inefficient and causes noticable flickering
> during the startup of perf-report, especially on large/slow terminals.
>
> It looks like the force-refresh in tui_progress__update() serves no
> purpose other than to clear the screen so that the progress bar of a
> previous operation does not subsume that of a subsequent operation.
> But we can do just that in a much more efficient manner by clearing only
> the region that a previous progress bar may have occupied before
> repainting the new progress bar.  Then the force-refresh could be
> removed with no change in visuals.
>
> This patch disables the slow force-refresh in tui_progress__update() and
> instead calls SLsmg_fill_region() on the entire area that the progress
> bar may occupy before repainting it.  This change makes the startup of
> perf-report much faster and appear much "smoother".
>
> It turns out that this was a big bottleneck in the startup speed of
> perf-report -- with this patch, perf-report starts up ~2x faster (1.1s
> vs 0.55s) on my machines.  (These numbers were measured by running
> "time perf report" on an 8MB perf.data and pressing 'q' immediately.)

Acked-by: Namhyung Kim <namhyung@kernel.org>

Thanks,
Namhyung

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [tip:perf/urgent] perf ui tui progress: Don' t force a refresh during progress update
  2013-10-26  0:25 ` [PATCH rebase] " Patrick Palka
  2013-10-28  5:52   ` Namhyung Kim
@ 2013-11-12 21:54   ` tip-bot for Patrick Palka
  1 sibling, 0 replies; 5+ messages in thread
From: tip-bot for Patrick Palka @ 2013-11-12 21:54 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: acme, linux-kernel, paulus, hpa, mingo, a.p.zijlstra, patrick,
	namhyung, tglx

Commit-ID:  d53e57d039c323fe3a43630e9f729df48134e2c9
Gitweb:     http://git.kernel.org/tip/d53e57d039c323fe3a43630e9f729df48134e2c9
Author:     Patrick Palka <patrick@parcs.ath.cx>
AuthorDate: Fri, 25 Oct 2013 20:25:49 -0400
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Mon, 11 Nov 2013 15:56:39 -0300

perf ui tui progress: Don't force a refresh during progress update

Each call to tui_progress__update() would forcibly refresh the entire
screen.  This is somewhat inefficient and causes noticable flickering
during the startup of perf-report, especially on large/slow terminals.

It looks like the force-refresh in tui_progress__update() serves no
purpose other than to clear the screen so that the progress bar of a
previous operation does not subsume that of a subsequent operation.  But
we can do just that in a much more efficient manner by clearing only the
region that a previous progress bar may have occupied before repainting
the new progress bar.  Then the force-refresh could be removed with no
change in visuals.

This patch disables the slow force-refresh in tui_progress__update() and
instead calls SLsmg_fill_region() on the entire area that the progress
bar may occupy before repainting it.  This change makes the startup of
perf-report much faster and appear much "smoother".

It turns out that this was a big bottleneck in the startup speed of
perf-report -- with this patch, perf-report starts up ~2x faster (1.1s
vs 0.55s) on my machines.  (These numbers were measured by running "time
perf report" on an 8MB perf.data and pressing 'q' immediately.)

Signed-off-by: Patrick Palka <patrick@parcs.ath.cx>
Acked-by: Ingo Molnar <mingo@kernel.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1382747149-9716-1-git-send-email-patrick@parcs.ath.cx
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/ui/tui/progress.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/tools/perf/ui/tui/progress.c b/tools/perf/ui/tui/progress.c
index 3e2d936..c61d14b 100644
--- a/tools/perf/ui/tui/progress.c
+++ b/tools/perf/ui/tui/progress.c
@@ -18,13 +18,14 @@ static void tui_progress__update(struct ui_progress *p)
 	if (p->total == 0)
 		return;
 
-	ui__refresh_dimensions(true);
+	ui__refresh_dimensions(false);
 	pthread_mutex_lock(&ui__lock);
 	y = SLtt_Screen_Rows / 2 - 2;
 	SLsmg_set_color(0);
 	SLsmg_draw_box(y, 0, 3, SLtt_Screen_Cols);
 	SLsmg_gotorc(y++, 1);
 	SLsmg_write_string((char *)p->title);
+	SLsmg_fill_region(y, 1, 1, SLtt_Screen_Cols - 2, ' ');
 	SLsmg_set_color(HE_COLORSET_SELECTED);
 	bar = ((SLtt_Screen_Cols - 2) * p->curr) / p->total;
 	SLsmg_fill_region(y, 1, 1, bar, ' ');

^ permalink raw reply related	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2013-11-12 21:55 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-10-23 21:59 [PATCH] perf/ui/tui: don't force a refresh during progress update Patrick Palka
2013-10-25 10:34 ` Ingo Molnar
2013-10-26  0:25 ` [PATCH rebase] " Patrick Palka
2013-10-28  5:52   ` Namhyung Kim
2013-11-12 21:54   ` [tip:perf/urgent] perf ui tui progress: Don' t " tip-bot for Patrick Palka

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.