e0b30b
This file summarizes changes to the top program and supporting documentation
e0b30b
introduced on March 31, 2011.
e0b30b
e0b30b
Contents:
e0b30b
      DOCUMENT Changes
e0b30b
      INTERNAL Improvements
e0b30b
      EXTERNAL Improvements
e0b30b
      BUGS Previously Fixed and Preserved
e0b30b
      BUGS Newly/Nearly Fixed
e0b30b
      BUGS/WISH-LISTS That Should Go Bye-bye
e0b30b
      BUGS FIXED You Didn't Know You Had
e0b30b
      OTHER Changes, Hopefully They Won't Bite You
e0b30b
      BENCHMARKS
e0b30b
e0b30b
e0b30b
DOCUMENT Changes =========================================================
e0b30b
  . The entire file was cleaned up, standardized and expanded to include:
e0b30b
    - a new section "2. SUMMARY Display" added for symmetry with Fields
e0b30b
    - nine new fields were added to section "3a. DESCRIPTIONS of Fields"
e0b30b
    - a new section "3b. MANAGING Fields" replaced the obsolete section
e0b30b
      "2b. SELECTING and ORDERING Columns"
e0b30b
    - section "5c. SCROLLING a Window" was added for that new feature
e0b30b
e0b30b
  . I don't know when the explanations for CODE and DATA were changed to
e0b30b
    show 'virtual' memory, but I think there's a reason their alternate
e0b30b
    names contain the word 'resident'.  Thus they were changed back to
e0b30b
    say 'physical memory'.
e0b30b
e0b30b
  . And as I indicated in a previous email, the former string identifier
e0b30b
    'ME' was restored as were the 'h' key/command conventions (vs. <h>).
e0b30b
e0b30b
    Oops, the 'h' key/command conventions remain restored, but subsequent
e0b30b
    testing revealed problems with the .ME string identifier.  Thus, it was
e0b30b
    changed to .WE (along with the companion .Me/.We id).
e0b30b
e0b30b
  . Also previously mentioned, the 'man2html' program translates top.1 to
e0b30b
    HTML with near perfect fidelity.  I take that to mean there should be
e0b30b
    no problems with the top.1 source on most other platforms.
e0b30b
e0b30b
    To further improve translation to HTML, several .Bd and .Ed macros
e0b30b
    were added to preserve literal (fixed width) spacing.
e0b30b
e0b30b
e0b30b
INTERNAL Improvements ====================================================
e0b30b
  . The old restriction of 26 fields has been lifted.  With this new-top
e0b30b
    100+ fields are now possible.  It currently supports up to 55, of
e0b30b
    which 35 are in use.  Adding a new field is almost too easy.
e0b30b
e0b30b
  . Task row construction has been considerably improved -- both from
e0b30b
    a programming perspective and a performance perspective.
e0b30b
e0b30b
  . The column highlighting costs for sort field visibility were
e0b30b
    virtually eliminated.
e0b30b
e0b30b
    An optional define (USE_X_COLHDR) can be enabled to completely
e0b30b
    eliminate any costs associated with the 'x' command toggle.
e0b30b
e0b30b
  . The management of the HST_t structures, used for %cpu calculations,
e0b30b
    was optimized with a hashing scheme.  Thus the need for a qsort then
e0b30b
    a binary search in each frame was completely eliminated.
e0b30b
e0b30b
    An optional define can restore the former qsort/bsearch approach but
e0b30b
    with an internal inlined binary search function offering substantially
e0b30b
    better performance than the old top.
e0b30b
e0b30b
  . This far more capable new-top executable is no larger than old top.
e0b30b
e0b30b
  . The above combine to produce substantially improved performance
e0b30b
    whose details are documented below under BENCHMARKS.
e0b30b
e0b30b
e0b30b
EXTERNAL Improvements ====================================================
e0b30b
  . Field management has been completely redesigned.  It's now embodied
e0b30b
    on a single screen where display-ability, position and sort selection
e0b30b
    can be handled in one place -- for all windows at one time!
e0b30b
e0b30b
    This function is dependent on cursor motion keys and should a device
e0b30b
    not have the customary arrow keys, alternatives are provided and
e0b30b
    documented under "Operation" near the beginning of the man page.
e0b30b
e0b30b
  . The following new fields have been added:
e0b30b
       Group Id
e0b30b
       Minor Page Faults
e0b30b
       Number of Threads
e0b30b
       Process Group Id
e0b30b
       Real User Id
e0b30b
       Saved User Id
e0b30b
       Saved User Name
e0b30b
       Session Id
e0b30b
       Tty Process Group Id
e0b30b
e0b30b
  . Scrolling keys now allow one to move the view of any window vertically
e0b30b
    or horizontally to reveal any desired task or column.  Previously, only
e0b30b
    some tasks were viewable even with reversible, selectable sort columns.
e0b30b
e0b30b
    Each of the four windows is capable of maintaining its own scrolled
e0b30b
    coordinates and an optional toggle ('C') displays a message aiding
e0b30b
    navigation within the available tasks and displayable fields.
e0b30b
e0b30b
  . User interactive line oriented input now provides for true line
e0b30b
    editing supported by these new keys:
e0b30b
        Left/Right arrow keys, Delete key, Backspace and
e0b30b
        Home/End keys (likely limited to xterm, not terminal)
e0b30b
e0b30b
  . User filtering via the -u | -U interactive commands is now window
e0b30b
    based which means that different windows could be used to filter
e0b30b
    different users.
e0b30b
e0b30b
  . Signal handling has been normalized and is now consistent regardless
e0b30b
    of the particular top screen a user may have been using.
e0b30b
e0b30b
  . The 'i' toggle now shows any task that has used *some* cpu since the
e0b30b
    last screen update.  It's no longer limited to just running tasks.
e0b30b
e0b30b
  . The summary area 'task states' line now reflects either 'Threads'
e0b30b
    or 'Tasks' depending on the -H toggle.
e0b30b
e0b30b
e0b30b
BUGS Previously Fixed and Preserved ======================================
e0b30b
  ( but not necessarily literally)
e0b30b
  . 228822, suspending top leaves xterm in slightly messed-up state
e0b30b
  . 256376, segfaults, if the xterm is to small
e0b30b
  . 320289, segv on sigwinch
e0b30b
  . 351065, wrong highlight 1st column (escape characters displayed)
e0b30b
  . 358724, accepts extra numeric args
e0b30b
  . 378695, seg fault if "/proc" is not mounted
e0b30b
  . 426782, UID field is too narrow
e0b30b
  . 458986, should check xterm for EOF/EIO
e0b30b
  . 459890, Irix mode should use %#4.1f when threads shown
e0b30b
e0b30b
e0b30b
BUGS Newly/Nearly Fixed ==================================================
e0b30b
  . 225542, 'Unknown command' message blocks further commands
e0b30b
      The message is now displayed using usleep for 1.25 seconds, instead
e0b30b
      of the former full 2 seconds.  And while it still blocks further
e0b30b
      commands, the delay is much more tolerable.
e0b30b
e0b30b
      Can we consider this bug 'nearly' fixed?
e0b30b
e0b30b
  . 410292, interface error when using backspace
e0b30b
      Full line editing was added but could be disabled via a #define.
e0b30b
      And via that define, even under basic termios support, the backspace
e0b30b
      problem was cured.
e0b30b
e0b30b
  . 567509, top idle command ('i') not working for threaded programs
e0b30b
      Since the 'i' command now reflects tasks that have used *some* cpu,
e0b30b
      and is no longer dependent on an 'R' state, I *believe/hope* this
e0b30b
      bug has been swatted.
e0b30b
e0b30b
e0b30b
BUGS/WISH-LISTS That Should Go Bye-bye ===================================
e0b30b
  . 340751, wish for hostname to benefit multiple top sessions
e0b30b
      Craig's suggestion regarding symlinks is the perfect solution.
e0b30b
      How dare Craig say that the solution was "not ideal" !
e0b30b
e0b30b
  . 586497, wish for graceful degradation on small screen sizes
e0b30b
      This objective could be accomplished by setting up 2 symlinks for
e0b30b
      top, personalizing them for the 2 tiny phone displays, then writing
e0b30b
      the respective configuration files.
e0b30b
e0b30b
      I shudder at the programming effort suggested by Paul.  And when it
e0b30b
      was done you'd find everybody else would have different criteria.
e0b30b
e0b30b
e0b30b
BUGS FIXED You Didn't Know You Had =======================================
e0b30b
  . Without amplifying the dirty details, the long standing occasionally
e0b30b
    reported display corruption, and an unreported source of performance
e0b30b
    degradation, has been eliminated.  The cure is in the elimination of
e0b30b
    the Pseudo_cols variable and the improved PUFF macro.
e0b30b
e0b30b
  . Line oriented input was not sensitive to screen width.  Thus a user
e0b30b
    could hold down any key and ultimately line wrap, overwriting the
e0b30b
    columns header and the entire screen.  New top prevents this.
e0b30b
e0b30b
  . User filtering (-u|-U) via a user ID (not name) now validates that
e0b30b
    number.  The old-top just made sure it was numeric, then blindly
e0b30b
    displayed no matching users (i.e. an empty window).
e0b30b
e0b30b
  . The threads toggle ('H') is no longer window based but more properly
e0b30b
    applies to all windows.  The previous implementation produced the
e0b30b
    following aberration if multiple windows were being shown:
e0b30b
      . -H would be acknowledged and applied to all visible windows
e0b30b
      . keying 'a' or 'w' would silently turn it off
e0b30b
      . then keying -H would turn it back on, but the user expected off
e0b30b
e0b30b
  . If you hit ^Z on any help or fields screen to suspend old-top, after
e0b30b
    issuing 'fg' you would then be left with a seemingly hung application
e0b30b
    inviting ^C.  In truth, one could recover with the space bar, but that
e0b30b
    was far from intuitive.
e0b30b
e0b30b
  . The old-top consistently writes 1 extra byte for each task row or 1
e0b30b
    byte too few for columns headers, depending on your perspective.
e0b30b
    The new top writes the same number of bytes for each.
e0b30b
e0b30b
  . By failing to clear to eol, old top left the display in a terrible
e0b30b
    state after exiting a 'fields' screen when only a few columns were
e0b30b
    being displayed.
e0b30b
e0b30b
  . The old-top used a zero value for the L_NONE library flag which could
e0b30b
    cause repeated rebuilding of columns headers with each frame.  In truth,
e0b30b
    this was not likely to happen in real life since only two fields actually
e0b30b
    used that flag.  However, if it did happen, performance could be degraded
e0b30b
    by 800%.
e0b30b
e0b30b
e0b30b
OTHER Changes, Hopefully They Won't Bite You =============================
e0b30b
  . The undocumented TOPRC environment variable is no longer supported.
e0b30b
    Any similar need can be met through a symlink alias.
e0b30b
e0b30b
  . The use of environment variables to override terminal size is now
e0b30b
    off by default but could be enabled through '#define TTYGETENVYES'.
e0b30b
e0b30b
  . The global 'bold enable' toggle is active by default and thus agrees
e0b30b
    with the documentation.  It's been wrong ever since Al's wholesale
e0b30b
    'cosmetic' changes in procps-3.2.2.
e0b30b
e0b30b
  . Task defaults now show bold (not reverse) and row highlighting.
e0b30b
    This agrees with what was always stated in the documentation.
e0b30b
e0b30b
  . The 'H' toggle (thread mode) is not persistent.  Persistence can be
e0b30b
    achieved with a simple shell script employing the -H switch.
e0b30b
e0b30b
  . Then 'g' and 'G' commands were reversed to reflect their likely use.
e0b30b
e0b30b
e0b30b
BENCHMARKS ===============================================================
e0b30b
  Tested as root with nice -10 and using only common fields
e0b30b
   ( on a pretty old, slow laptop under Debian Lenny )
e0b30b
  but rcfiles specified identical sort fields and identical
e0b30b
  settings for the 'B', 'b', 'x' and 'y' toggles (even though
e0b30b
  the defaults are not necessarily identical).
e0b30b
e0b30b
  In every case new-top outperforms old-top, but I've shown %
e0b30b
  improvements for only the most significant.  Those cases mostly
e0b30b
  involve colors with both row & column highlighting.  I suggested
e0b30b
  above that the highlighting cost was virtually eliminated in
e0b30b
  new-top, and these tests bare that out.
e0b30b
e0b30b
  Note the much smaller differences for new-top between the 24x80
e0b30b
  window results and full screen (but don't mix apples_terminal
e0b30b
  with oranges_xterm).  This is a reflection of the simplification
e0b30b
  of task row construction, also mentioned above.
e0b30b
e0b30b
  It's always been the case that any top in an xterm outperforms
e0b30b
  that top under the terminal application, even when the xterm
e0b30b
  provides additional rows and columns.  It's true below with
e0b30b
  Gnome and it was true nine years ago under KDE.
e0b30b
e0b30b
  ----------------------------------------------------------
e0b30b
   The following comparisons were run with:
e0b30b
      100 tasks & 160 threads
e0b30b
      -d0 -n5000
e0b30b
                                 new-top        old-top
e0b30b
  xterm     24x80
e0b30b
 a  1 win,  lflgs_none         11.2 secs      51.8 secs    + 462.6%
e0b30b
    1 win,  default            61.0 secs      66.8 secs
e0b30b
    1 win,  colors w/ x+y      61.3 secs      83.0 secs    + 135.4%
e0b30b
    1 win,  thread mode        88.3 secs      94.2 secs
e0b30b
 b  1 win,  every field on     99.7 secs     106.0 secs
e0b30b
    1 win,  cmdline            71.2 secs      76.6 secs
e0b30b
    4 wins, defaults          101.3 secs     107.2 secs
e0b30b
    4 wins, colors w/ x+y     101.5 secs     122.8 secs    + 121.0%
e0b30b
e0b30b
  xterm, full screen (53x170)
e0b30b
 a  1 win,  lflgs_none         15.9 secs      54.2 secs    + 340.9%
e0b30b
    1 win,  default            70.0 secs      73.2 secs
e0b30b
    1 win,  colors w/ x+y      69.4 secs     131.3 secs    + 189.2%
e0b30b
    1 win,  thread mode        97.6 secs     102.6 secs
e0b30b
 c  1 win,  every field on    122.1 secs     128.1 secs
e0b30b
    1 win,  cmdline            80.8 secs      83.7 secs
e0b30b
    4 wins, defaults          111.4 secs     115.8 secs
e0b30b
    4 wins, colors w/ x+y     112.0 secs     172.9 secs    + 154.4%
e0b30b
e0b30b
  terminal  24x80
e0b30b
 a  1 win,  lflgs_none          8.9 secs      58.6 secs    + 658.4%
e0b30b
    1 win,  default            70.1 secs      80.3 secs
e0b30b
    1 win,  colors w/ x+y      70.6 secs     157.3 secs    + 222.8%
e0b30b
    1 win,  thread mode       104.7 secs     120.5 secs
e0b30b
 b  1 win,  every field on    111.2 secs     134.5 secs
e0b30b
    1 win,  cmdline            83.8 secs      94.5 secs
e0b30b
    4 wins, defaults          125.6 secs     146.7 secs
e0b30b
    4 wins, colors w/ x+y     125.6 secs     206.9 secs    + 176.7%
e0b30b
e0b30b
  terminal, full screen (39x125)
e0b30b
 a  1 win,  lflgs_none          9.1 secs      60.6 secs    + 665.9%
e0b30b
    1 win,  default            74.3 secs      88.0 secs
e0b30b
    1 win,  colors w/ x+y      73.9 secs     314.5 secs    + 425.6%
e0b30b
    1 win,  thread mode       113.0 secs     140.9 secs
e0b30b
 b  1 win,  every field on    117.7 secs     154.9 secs
e0b30b
    1 win,  cmdline            87.4 secs     107.2 secs
e0b30b
    4 wins, defaults          139.1 secs     166.7 secs
e0b30b
    4 wins, colors w/ x+y     157.3 secs     423.2 secs    + 269.0%
e0b30b
e0b30b
  ----------------------------------------------------------
e0b30b
   The following comarisons were run with:
e0b30b
      300 tasks & 360 threads
e0b30b
      -d0 -n3000
e0b30b
                                 new-top        old-top
e0b30b
  xterm, full screen (53x170)
e0b30b
 a  1 win,  lflgs_none         14.3 secs      79.0 secs    + 552.4%
e0b30b
    1 win,  default           101.1 secs     104.5 secs
e0b30b
    1 win,  colors w/ x+y     101.3 secs     140.0 secs    + 138.2%
e0b30b
    1 win,  thread mode       120.1 secs     123.1 secs
e0b30b
 c  1 win,  every field on    179.8 secs     185.6 secs
e0b30b
    1 win,  cmdline           124.9 secs     132.8 secs
e0b30b
    4 wins, defaults          174.8 secs     179.2 secs
e0b30b
    4 wins, colors w/ x+y     175.0 secs     215.2 secs    + 123.0%
e0b30b
e0b30b
  terminal, full screen (39x125)
e0b30b
 a  1 win,  lflgs_none         12.3 secs      98.5 secs    + 800.8%
e0b30b
    1 win,  default           117.4 secs     134.0 secs
e0b30b
    1 win,  colors w/ x+y     111.6 secs     296.1 secs    + 265.3%
e0b30b
    1 win,  thread mode       141.3 secs     155.3 secs
e0b30b
 b  1 win,  every field on    197.7 secs     204.8 secs
e0b30b
    1 win,  cmdline           143.9 secs     157.3 secs
e0b30b
    4 wins, defaults          204.0 secs     226.2 secs
e0b30b
    4 wins, colors w/ x+y     216.9 secs     434.5 secs    + 200.3%
e0b30b
e0b30b
  . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
e0b30b
e0b30b
notes:
e0b30b
 a  these results represent the library flags L_NONE zero value and
e0b30b
    thus the hidden cost of rebuilding column headers w/ every frame
e0b30b
 b  while every common field was turned on, not all fields could be
e0b30b
    displayed due to limited screen width
e0b30b
 c  only in a full screen xterm window could all common fields
e0b30b
    actually be displayed
e0b30b
e0b30b
e0b30b
BENCHMARKS, Redux (for NLS) ==============================================
e0b30b
  December, 2011 benchmarks produced on a much more modern
e0b30b
  platform containing:
e0b30b
     Intel(R) Core(TM) i3-2310M CPU @ 2.10GHz
e0b30b
     SMP with 4 cpus
e0b30b
  reflected in the substantially reduced elapsed times.
e0b30b
e0b30b
  Tested as root with nice -10 and using only common fields
e0b30b
  but rcfiles specified identical sort fields and identical
e0b30b
  settings for the 'B', 'b', 'x' and 'y' toggles (even though
e0b30b
  the defaults are not necessarily identical).
e0b30b
e0b30b
  Each test was run outside of X-windows at a linux console
e0b30b
  offering 48 rows and 170 columns.  This was done to reduce
e0b30b
  contention which sometimes made comparisons problematic.
e0b30b
e0b30b
  old-top = procps-3.2.8 (debian patched and memory leaking)
e0b30b
  new-top = procps-ng-3.3.2 with NLS support
e0b30b
e0b30b
  ----------------------------------------------------------
e0b30b
   The following comparisons were run with
e0b30b
      -d0 -n5000
e0b30b
      140 tasks & 275 threads
e0b30b
e0b30b
  linux console (48x170)         new-top        old-top
e0b30b
 d  1 win,  lflgs_none          2.6 secs      15.0 secs    + 577.0%
e0b30b
    1 win,  default            16.1 secs      19.3 secs
e0b30b
    1 win,  colors w/ x+y      16.6 secs      35.0 secs    + 210.8%
e0b30b
 e  1 win,  show cpus          16.2 secs      20.1 secs    + 124.1%
e0b30b
    1 win,  thread mode        31.8 secs      34.1 secs
e0b30b
 f  1 win,  every field on     30.5 secs      34.0 secs
e0b30b
    1 win,  cmdline            19.9 secs      23.1 secs
e0b30b
    4 wins, default            31.9 secs      35.2 secs
e0b30b
    4 wins, colors w/ x+y      29.2 secs      47.4 secs    + 162.3%
e0b30b
 g  1 win,  b&w w/ bold x      30.0 secs      33.2 secs
e0b30b
 h  1 win,  scroll msg on      31.1 secs      33.9 secs
e0b30b
e0b30b
  . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
e0b30b
e0b30b
notes:
e0b30b
 d  these represent the same anamoly as the original 'a' footnote
e0b30b
 e  these represent the '1' toggle, where each of 4 cpus was shown
e0b30b
      (not possible on the original uniprocessor)
e0b30b
 f  every common field was turned on and all fields were visible
e0b30b
 g  on a black and white display, sort column was shown in bold
e0b30b
      (further proof of column highlighting improvements)
e0b30b
 h  similar to 'g', but new top was showing scroll msg
e0b30b
      (old top has no such provision)