lkml.org 
[lkml]   [2009]   [Dec]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5/5] perf diff: Fix support for all --sort combinations
    Date
    From: Arnaldo Carvalho de Melo <acme@redhat.com>

    When we finish creating the hist_entries we _already_ have them sorted "by
    name", in fact by what is in --sort, that is exactly how we can find the pairs
    in perf_session__match_hists as 'comm', 'dso' & 'symbol' all are strings we
    need to find the matches in the baseline session.

    So only do the sort by hits followed by a resort by --sort if we need to find
    the position for shwowing the --displacement of hist entries.

    Now all these modes work correctly:

    Example is a simple 'perf record -f find / > /dev/null' ran twice then followed
    by the following commands:

    $ perf diff -f --sort comm
    # Baseline Delta Command
    # ........ .......... .......
    #
    0.00% +100.00% find
    $ perf diff -f --sort dso
    # Baseline Delta Shared Object
    # ........ .......... ..................
    #
    59.97% -0.44% [kernel]
    21.17% +0.28% libc-2.5.so
    18.49% +0.16% [ext3]
    0.37% find
    $ perf diff -f --sort symbol | head -8
    # Baseline Delta Symbol
    # ........ .......... ......
    #
    6.21% +0.36% [k] ext3fs_dirhash
    3.43% +0.41% [.] __GI_strlen
    3.53% +0.16% [k] __kmalloc
    3.17% +0.49% [k] system_call
    3.06% +0.37% [k] ext3_htree_store_dirent
    $ perf diff -f --sort dso,symbol | head -8
    # Baseline Delta Shared Object Symbol
    # ........ .......... .................. ......
    #
    6.21% +0.36% [ext3] [k] ext3fs_dirhash
    3.43% +0.41% libc-2.5.so [.] __GI_strlen
    3.53% +0.16% [kernel] [k] __kmalloc
    3.17% +0.49% [kernel] [k] system_call
    3.06% +0.37% [ext3] [k] ext3_htree_store_dirent
    $

    And we don't have to do two expensive resorts in the common, non --displacement
    case.

    Cc: Frédéric Weisbecker <fweisbec@gmail.com>
    Cc: Mike Galbraith <efault@gmx.de>
    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Paul Mackerras <paulus@samba.org>
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    ---
    tools/perf/builtin-diff.c | 52 ++++++++++++++++++--------------------------
    1 files changed, 21 insertions(+), 31 deletions(-)

    diff --git a/tools/perf/builtin-diff.c b/tools/perf/builtin-diff.c
    index 876a4b9..924bfb7 100644
    --- a/tools/perf/builtin-diff.c
    +++ b/tools/perf/builtin-diff.c
    @@ -82,29 +82,19 @@ static void perf_session__insert_hist_entry_by_name(struct rb_root *root,
    struct hist_entry *iter;

    while (*p != NULL) {
    - int cmp;
    parent = *p;
    iter = rb_entry(parent, struct hist_entry, rb_node);
    -
    - cmp = strcmp(he->map->dso->name, iter->map->dso->name);
    - if (cmp > 0)
    + if (hist_entry__cmp(he, iter) < 0)
    p = &(*p)->rb_left;
    - else if (cmp < 0)
    + else
    p = &(*p)->rb_right;
    - else {
    - cmp = strcmp(he->sym->name, iter->sym->name);
    - if (cmp > 0)
    - p = &(*p)->rb_left;
    - else
    - p = &(*p)->rb_right;
    - }
    }

    rb_link_node(&he->rb_node, parent, p);
    rb_insert_color(&he->rb_node, root);
    }

    -static void perf_session__resort_by_name(struct perf_session *self)
    +static void perf_session__resort_hist_entries(struct perf_session *self)
    {
    unsigned long position = 1;
    struct rb_root tmp = RB_ROOT;
    @@ -122,29 +112,28 @@ static void perf_session__resort_by_name(struct perf_session *self)
    self->hists = tmp;
    }

    +static void perf_session__set_hist_entries_positions(struct perf_session *self)
    +{
    + perf_session__output_resort(self, self->events_stats.total);
    + perf_session__resort_hist_entries(self);
    +}
    +
    static struct hist_entry *
    -perf_session__find_hist_entry_by_name(struct perf_session *self,
    - struct hist_entry *he)
    +perf_session__find_hist_entry(struct perf_session *self,
    + struct hist_entry *he)
    {
    struct rb_node *n = self->hists.rb_node;

    while (n) {
    struct hist_entry *iter = rb_entry(n, struct hist_entry, rb_node);
    - int cmp = strcmp(he->map->dso->name, iter->map->dso->name);
    + int64_t cmp = hist_entry__cmp(he, iter);

    - if (cmp > 0)
    + if (cmp < 0)
    n = n->rb_left;
    - else if (cmp < 0)
    + else if (cmp > 0)
    n = n->rb_right;
    - else {
    - cmp = strcmp(he->sym->name, iter->sym->name);
    - if (cmp > 0)
    - n = n->rb_left;
    - else if (cmp < 0)
    - n = n->rb_right;
    - else
    - return iter;
    - }
    + else
    + return iter;
    }

    return NULL;
    @@ -155,11 +144,9 @@ static void perf_session__match_hists(struct perf_session *old_session,
    {
    struct rb_node *nd;

    - perf_session__resort_by_name(old_session);
    -
    for (nd = rb_first(&new_session->hists); nd; nd = rb_next(nd)) {
    struct hist_entry *pos = rb_entry(nd, struct hist_entry, rb_node);
    - pos->pair = perf_session__find_hist_entry_by_name(old_session, pos);
    + pos->pair = perf_session__find_hist_entry(old_session, pos);
    }
    }

    @@ -177,9 +164,12 @@ static int __cmd_diff(void)
    ret = perf_session__process_events(session[i], &event_ops);
    if (ret)
    goto out_delete;
    - perf_session__output_resort(session[i], session[i]->events_stats.total);
    }

    + perf_session__output_resort(session[1], session[1]->events_stats.total);
    + if (show_displacement)
    + perf_session__set_hist_entries_positions(session[0]);
    +
    perf_session__match_hists(session[0], session[1]);
    perf_session__fprintf_hists(session[1], session[0],
    show_displacement, stdout);
    --
    1.5.5.1
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2009-12-29 01:51    [W:0.033 / U:67.124 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site