 0c4e774fad
			
		
	
	
	0c4e774fad
	
	
	
		
			
			Caching registers value into an array. Got about 4% speed up
of perf_reg_value function for report command processing
dwarf unwind stacks.
Output from report over 1.5 GB data with DWARF unwind stacks:
(TODO fix perf diff)
  current code:
   5.84%     perf  perf                       [.] perf_reg_value
  change:
   1.94%     perf  perf                       [.] perf_reg_value
And little bit of overall speed up:
(perf stat -r 5 -e '{cycles,instructions}:u' ...)
  current code:
   310,298,611,754      cycles                     ( +-  0.33% )
   439,669,689,341      instructions               ( +-  0.03% )
     188.656753166 seconds time elapsed            ( +-  0.82% )
  change:
   291,315,329,878      cycles                     ( +-  0.22% )
   391,763,485,304      instructions               ( +-  0.03%  )
     180.742249687 seconds time elapsed            ( +-  0.64% )
Acked-by: Namhyung Kim <namhyung@kernel.org>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jean Pihet <jean.pihet@linaro.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/1401892622-30848-2-git-send-email-jolsa@kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
		
	
			
		
			
				
	
	
		
			27 lines
		
	
	
	
		
			449 B
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			27 lines
		
	
	
	
		
			449 B
			
		
	
	
	
		
			C
		
	
	
	
	
	
| #include <errno.h>
 | |
| #include "perf_regs.h"
 | |
| #include "event.h"
 | |
| 
 | |
| int perf_reg_value(u64 *valp, struct regs_dump *regs, int id)
 | |
| {
 | |
| 	int i, idx = 0;
 | |
| 	u64 mask = regs->mask;
 | |
| 
 | |
| 	if (regs->cache_mask & (1 << id))
 | |
| 		goto out;
 | |
| 
 | |
| 	if (!(mask & (1 << id)))
 | |
| 		return -EINVAL;
 | |
| 
 | |
| 	for (i = 0; i < id; i++) {
 | |
| 		if (mask & (1 << i))
 | |
| 			idx++;
 | |
| 	}
 | |
| 
 | |
| 	regs->cache_mask |= (1 << id);
 | |
| 	regs->cache_regs[id] = regs->regs[idx];
 | |
| 
 | |
| out:
 | |
| 	*valp = regs->cache_regs[id];
 | |
| 	return 0;
 | |
| }
 |