diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2018-03-07 04:47:52 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2018-03-07 04:47:52 +0100 |
commit | a2cae937d026d70f5014b95498b08251f73d39eb (patch) | |
tree | 28a743e515dab5fca103f24697aa49e0814e2dec /procps | |
parent | 75e56a3db9c1415dac1a3d83a12f694930897a8c (diff) |
top: much faster cursor key navigation by avoiding process rescan
function old new delta
handle_input 549 560 +11
top_main 889 891 +2
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'procps')
-rw-r--r-- | procps/top.c | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/procps/top.c b/procps/top.c index fc056621b..075c96c27 100644 --- a/procps/top.c +++ b/procps/top.c @@ -896,7 +896,8 @@ enum { | PSSCAN_PID | PSSCAN_SMAPS | PSSCAN_COMM, - EXIT_MASK = (unsigned)-1, + EXIT_MASK = 0, + NO_RESCAN_MASK = (unsigned)-1, }; #if ENABLE_FEATURE_TOP_INTERACTIVE @@ -934,7 +935,7 @@ static unsigned handle_input(unsigned scan_mask, unsigned interval) } if (c == KEYCODE_HOME) { G_scroll_ofs = 0; - break; + goto normalize_ofs; } if (c == KEYCODE_END) { G_scroll_ofs = ntop - G.lines / 2; @@ -951,7 +952,7 @@ static unsigned handle_input(unsigned scan_mask, unsigned interval) G_scroll_ofs = ntop - 1; if (G_scroll_ofs < 0) G_scroll_ofs = 0; - break; + return NO_RESCAN_MASK; } c |= 0x20; /* lowercase */ @@ -1156,6 +1157,7 @@ int top_main(int argc UNUSED_PARAM, char **argv) #endif while (scan_mask != EXIT_MASK) { + unsigned new_mask; procps_status_t *p = NULL; if (OPT_BATCH_MODE) { @@ -1233,21 +1235,32 @@ int top_main(int argc UNUSED_PARAM, char **argv) #else qsort(top, ntop, sizeof(top_status_t), (void*)(sort_function[0])); #endif - display_process_list(G.lines, col); } #if ENABLE_FEATURE_TOPMEM else { /* TOPMEM */ qsort(topmem, ntop, sizeof(topmem_status_t), (void*)topmem_sort); + } +#endif + IF_FEATURE_TOP_INTERACTIVE(display:) + IF_FEATURE_TOPMEM(if (scan_mask != TOPMEM_MASK)) { + display_process_list(G.lines, col); + } +#if ENABLE_FEATURE_TOPMEM + else { /* TOPMEM */ display_topmem_process_list(G.lines, col); } #endif - clearmems(); if (iterations >= 0 && !--iterations) break; #if !ENABLE_FEATURE_TOP_INTERACTIVE + clearmems(); sleep(interval); #else - scan_mask = handle_input(scan_mask, interval); + new_mask = handle_input(scan_mask, interval); + if (new_mask == NO_RESCAN_MASK) + goto display; + scan_mask = new_mask; + clearmems(); #endif } /* end of "while (not Q)" */ |