Summary:
Following from previous diff.
**Idea** -  80% of functions with Top cost are caused by calling top-costed callees, i.e. callee's Top cost is simply propagated to its transitive callers, so the aim is to investigate such root callees along with the number of their transitive callers.
Consider the following code
```
void bar1() {
   // top cost function
}
void bar2() {
  // another top cost function
}
void baz(){
  // baz have top cost because of bar
   bar1();
}
void foo() {
  // goo have top cost because of baz
   baz();
   bar2()
}
```
Clearly, the root cause of the foo being top cost is `bar1` and `bar2`.
1. When we are analyzing `baz`, we know that it calls `bar1`, which is top cost, so we record that `baz = { T, bar1 } `.
2. Now, say we are analyzing foo.
 When we analyze the call to `baz`, we found out that the top cost of `baz` is caused by `bar1`, so we record `foo = { T, bar1 }`.
When we analyze the call to `bar2`, we know that `bar2` is top cost, but since at this stage we only want to deal with the first top cost function we met, so we ignore it.
Since we are keeping track of top cost function by examining the `Call` instruction, we would expect to see two log of `bar1` in the result. The test plan confirms it.
Reviewed By: ezgicicek
Differential Revision: D22231457
fbshipit-source-id: 45d48e4a7
			
			
				master
			
			
		
							parent
							
								
									ba2bad25aa
								
							
						
					
					
						commit
						bfe2caf92d
					
				
					Loading…
					
					
				
		Reference in new issue