diff --git a/src/python/bcc/table.py b/src/python/bcc/table.py index 0fb6f2f40bea..7eeb059e0104 100644 --- a/src/python/bcc/table.py +++ b/src/python/bcc/table.py @@ -54,7 +54,7 @@ def _stars(val, val_max, width): return text -def _print_log2_hist(vals, val_type): +def _print_log2_hist(vals, val_type, strip_leading_zero): global stars_max log2_dist_max = 64 idx_max = -1 @@ -74,15 +74,23 @@ def _print_log2_hist(vals, val_type): stars = int(stars_max / 2) if idx_max > 0: - print(header % val_type); + print(header % val_type) + for i in range(1, idx_max + 1): low = (1 << i) >> 1 high = (1 << i) - 1 if (low == high): low -= 1 val = vals[i] - print(body % (low, high, val, stars, - _stars(val, val_max, stars))) + + if strip_leading_zero: + if val: + print(body % (low, high, val, stars, + _stars(val, val_max, stars))) + strip_leading_zero = False + else: + print(body % (low, high, val, stars, + _stars(val, val_max, stars))) def _print_linear_hist(vals, val_type): global stars_max @@ -281,7 +289,7 @@ def next(self, key): return next_key def print_log2_hist(self, val_type="value", section_header="Bucket ptr", - section_print_fn=None, bucket_fn=None): + section_print_fn=None, bucket_fn=None, strip_leading_zero=None): """print_log2_hist(val_type="value", section_header="Bucket ptr", section_print_fn=None, bucket_fn=None) @@ -292,8 +300,10 @@ def print_log2_hist(self, val_type="value", section_header="Bucket ptr", If section_print_fn is not None, it will be passed the bucket value to format into a string as it sees fit. If bucket_fn is not None, it will be used to produce a bucket value for the histogram keys. - The maximum index allowed is log2_index_max (65), which will - accomodate any 64-bit integer in the histogram. + If the value of strip_leading_zero is not False, prints a histogram + that is omitted leading zeros from the beginning. The maximum index + allowed is log2_index_max (65), which will accomodate any 64-bit + integer in the histogram. """ if isinstance(self.Key(), ct.Structure): tmp = {} @@ -312,12 +322,12 @@ def print_log2_hist(self, val_type="value", section_header="Bucket ptr", section_print_fn(bucket))) else: print("\n%s = %r" % (section_header, bucket)) - _print_log2_hist(vals, val_type) + _print_log2_hist(vals, val_type, strip_leading_zero) else: vals = [0] * log2_index_max for k, v in self.items(): vals[k.value] = v.value - _print_log2_hist(vals, val_type) + _print_log2_hist(vals, val_type, strip_leading_zero) def print_linear_hist(self, val_type="value", section_header="Bucket ptr", section_print_fn=None, bucket_fn=None): @@ -709,4 +719,3 @@ def __delitem__(self, key): def clear(self): pass - diff --git a/tools/funclatency_example.txt b/tools/funclatency_example.txt index a4c6f8803c17..ee63a5bbb41c 100644 --- a/tools/funclatency_example.txt +++ b/tools/funclatency_example.txt @@ -76,7 +76,7 @@ Tracing 1 function for "pthread:pthread_mutex_lock"... Hit Ctrl-C to end. 1048576 -> 2097151 : 9 | | Detaching... -It seems that most calls to pthread_mutex_lock completed rather quickly (in +It seems that most calls to pthread_mutex_lock completed rather quickly (in under 4us), but there were some cases of considerable contention, sometimes over a full millisecond.