@@ -15,7 +15,7 @@ use pprof_pb::querier::v1::FlameGraphDiff;
15
15
use pprof_pb:: querier:: v1:: Level ;
16
16
use pprof_pb:: querier:: v1:: SelectMergeStacktracesResponse ;
17
17
use prost:: Message ;
18
- use std:: collections:: { HashMap , HashSet } ;
18
+ use std:: collections:: { HashMap , HashSet , VecDeque } ;
19
19
use std:: io:: Read ;
20
20
use std:: panic;
21
21
use std:: sync:: Arc ;
@@ -655,28 +655,33 @@ fn compute_flame_graph_diff(t1: &Tree, t2: &Tree) -> FlameGraphDiff {
655
655
res. right_ticks = t2. total ( ) [ 0 ] ;
656
656
res. total = res. left_ticks + res. right_ticks ;
657
657
658
- let mut left_nodes = vec ! [ Arc :: new( TreeNodeV2 {
658
+ let mut left_nodes: VecDeque < Arc < TreeNodeV2 > > = VecDeque :: new ( ) ;
659
+ left_nodes. push_back ( Arc :: new ( TreeNodeV2 {
659
660
fn_id : 0 ,
660
661
node_id : 0 ,
661
662
slf : vec ! [ 0 ] ,
662
663
total : vec ! [ res. left_ticks] ,
663
- } ) ] ;
664
+ } ) ) ;
664
665
665
- let mut right_nodes = vec ! [ Arc :: new( TreeNodeV2 {
666
+ let mut right_nodes: VecDeque < Arc < TreeNodeV2 > > = VecDeque :: new ( ) ;
667
+ right_nodes. push_back ( Arc :: new ( TreeNodeV2 {
666
668
fn_id : 0 ,
667
669
node_id : 0 ,
668
670
slf : vec ! [ 0 ] ,
669
671
total : vec ! [ res. right_ticks] ,
670
- } ) ] ;
672
+ } ) ) ;
671
673
672
674
let mut levels = vec ! [ 0 ] ;
673
- let mut x_left_offsets = vec ! [ 0 ] ;
674
- let mut x_right_offsets = vec ! [ 0 ] ;
675
+ let mut x_left_offsets: VecDeque < i64 > = VecDeque :: new ( ) ;
676
+ x_left_offsets. push_back ( 0 ) ;
677
+ let mut x_right_offsets = VecDeque :: new ( ) ;
678
+ x_right_offsets. push_back ( 0 ) ;
675
679
let mut name_location_cache: HashMap < String , i64 > = HashMap :: new ( ) ;
676
680
677
- while let ( Some ( left) , Some ( right) ) = ( left_nodes. pop ( ) , right_nodes. pop ( ) ) {
678
- let x_left_offset = x_left_offsets. pop ( ) . unwrap ( ) ;
679
- let x_right_offset = x_right_offsets. pop ( ) . unwrap ( ) ;
681
+ while let ( Some ( left) , Some ( right) ) =
682
+ ( left_nodes. pop_back ( ) , right_nodes. pop_back ( ) ) {
683
+ let mut x_left_offset = x_left_offsets. pop_back ( ) . unwrap ( ) . clone ( ) ;
684
+ let mut x_right_offset = x_right_offsets. pop_back ( ) . unwrap ( ) . clone ( ) ;
680
685
let level = levels. pop ( ) . unwrap ( ) ;
681
686
682
687
let name = if left. fn_id == 0 {
@@ -694,6 +699,13 @@ fn compute_flame_graph_diff(t1: &Tree, t2: &Tree) -> FlameGraphDiff {
694
699
res. levels . push ( Level :: default ( ) ) ;
695
700
}
696
701
702
+ if res. max_self < left. slf [ 0 ] {
703
+ res. max_self = left. slf [ 0 ] ;
704
+ }
705
+ if res. max_self < right. slf [ 0 ] {
706
+ res. max_self = right. slf [ 0 ] ;
707
+ }
708
+
697
709
res. levels [ level] . values . extend_from_slice ( & [
698
710
x_left_offset,
699
711
left. total [ 0 ] ,
@@ -708,15 +720,30 @@ fn compute_flame_graph_diff(t1: &Tree, t2: &Tree) -> FlameGraphDiff {
708
720
let empty_vec = Vec :: new ( ) ;
709
721
let children_right = t2. nodes . get ( & right. node_id ) . unwrap_or ( & empty_vec) ;
710
722
for ( child_left, child_right) in children_left. iter ( ) . zip ( children_right. iter ( ) ) {
711
- left_nodes. push ( child_left. clone ( ) ) ;
712
- right_nodes. push ( child_right. clone ( ) ) ;
713
- x_left_offsets. push ( x_left_offset + child_left. total [ 0 ] ) ;
714
- x_right_offsets. push ( x_right_offset + child_right. total [ 0 ] ) ;
715
- levels. push ( level + 1 ) ;
723
+ left_nodes. push_front ( child_left. clone ( ) ) ;
724
+ right_nodes. push_front ( child_right. clone ( ) ) ;
725
+ x_left_offsets. push_front ( x_left_offset. clone ( ) ) ;
726
+ x_right_offsets. push_front ( x_right_offset. clone ( ) ) ;
727
+ x_left_offset += child_left. total [ 0 ] . clone ( ) ;
728
+ x_right_offset += child_right. total [ 0 ] . clone ( ) ;
729
+ levels. insert ( 0 , level + 1 ) ;
716
730
}
717
731
}
718
732
}
719
733
734
+ for i in 0 ..res. levels . len ( ) {
735
+ let mut j = 0 ;
736
+ let mut prev0 = 0i64 ;
737
+ let mut prev3 = 0i64 ;
738
+ while j < res. levels [ i] . values . len ( ) {
739
+ res. levels [ i] . values [ j] -= prev0;
740
+ prev0 += res. levels [ i] . values [ j] + res. levels [ i] . values [ j+1 ] ;
741
+ res. levels [ i] . values [ j+3 ] -= prev3;
742
+ prev3 += res. levels [ i] . values [ j+3 ] + res. levels [ i] . values [ j+4 ] ;
743
+ j += 7 ;
744
+ }
745
+ }
746
+
720
747
res
721
748
}
722
749
0 commit comments