1
1
#!/usr/bin/env ruby
2
2
3
+ $LOAD_PATH. unshift File . expand_path ( "../../lib" , __FILE__ )
4
+
3
5
require "optparse"
4
6
require "vernier/version"
5
7
@@ -69,37 +71,23 @@ FLAGS:
69
71
70
72
def self . inverted_tree ( top , file )
71
73
# Print the inverted tree from a Vernier profile
72
- require "json"
73
-
74
- is_gzip = File . binread ( file , 2 ) == "\x1F \x8B " . b # check for gzip header
75
-
76
- json = if is_gzip
77
- require "zlib"
78
- Zlib ::GzipReader . open ( file ) { |gz | gz . read }
79
- else
80
- File . read file
81
- end
74
+ require "vernier/parsed_profile"
82
75
83
- info = JSON . load json
84
-
85
- main = info [ "threads" ] . find { |thread | thread [ "isMainThread" ] }
76
+ parsed_profile = Vernier ::ParsedProfile . read_file ( file )
77
+ main_thread = parsed_profile . main_thread
78
+ main = main_thread . data
79
+ stack_table = main_thread . stack_table
86
80
87
81
weight_by_frame = Hash . new ( 0 )
88
82
89
- stack_frames = main [ "stackTable" ] [ "frame" ]
90
- frame_func_table = main [ "frameTable" ] [ "func" ]
91
- func_name_table = main [ "funcTable" ] [ "name" ]
92
- string_array = main [ "stringArray" ]
93
-
94
83
main [ "samples" ] [ "stack" ] . zip ( main [ "samples" ] [ "weight" ] ) . each do |stack , weight |
95
- top_frame_index = stack_frames [ stack ]
96
- func_index = frame_func_table [ top_frame_index ]
97
- string_index = func_name_table [ func_index ]
98
- str = string_array [ string_index ]
84
+ top_frame_index = stack_table . stack_frame_idx ( stack )
85
+ func_index = stack_table . frame_func_idx ( top_frame_index )
86
+ str = stack_table . func_name ( func_index )
99
87
weight_by_frame [ str ] += weight
100
88
end
101
89
102
- total = weight_by_frame . values . inject :+
90
+ total = weight_by_frame . values . sum
103
91
104
92
header = [ "Samples" , "%" , "" ]
105
93
widths = header . map ( &:bytesize )
@@ -120,17 +108,16 @@ FLAGS:
120
108
h [ k ] = SamplesByLocation . new
121
109
end
122
110
123
- stack_parents = main [ "stackTable" ] [ "prefix" ]
124
111
main [ "samples" ] [ "stack" ] . zip ( main [ "samples" ] [ "weight" ] ) . each do |stack_idx , weight |
125
112
# self time
126
- top_frame_index = stack_frames [ stack_idx ]
113
+ top_frame_index = stack_table . stack_frame_idx ( stack_idx )
127
114
self_samples_by_frame [ top_frame_index ] . self += weight
128
115
129
116
# total time
130
117
while stack_idx
131
- frame_idx = stack_frames [ stack_idx ]
118
+ frame_idx = stack_table . stack_frame_idx ( stack_idx )
132
119
self_samples_by_frame [ frame_idx ] . total += weight
133
- stack_idx = stack_parents [ stack_idx ]
120
+ stack_idx = stack_table . stack_parent_idx ( stack_idx )
134
121
end
135
122
end
136
123
@@ -143,18 +130,28 @@ FLAGS:
143
130
frame_lines = main [ "frameTable" ] [ "line" ]
144
131
func_filenames = main [ "funcTable" ] [ "fileName" ]
145
132
self_samples_by_frame . each do |frame , samples |
146
- line = frame_lines [ frame ]
147
- func_index = frame_func_table [ frame ]
148
- filename = func_filenames [ func_index ]
149
- #string_index = func_name_table[func_index]
133
+ line = stack_table . frame_line_no ( frame )
134
+ func_index = stack_table . frame_func_idx ( frame )
135
+ filename = stack_table . func_filename_idx ( func_index )
150
136
151
137
samples_by_file [ filename ] [ line ] += samples
152
138
end
153
139
154
- samples_by_file . transform_keys! { string_array [ _1 ] }
140
+ samples_by_file . transform_keys! { stack_table . strings [ _1 ] }
155
141
156
- #FIXME
157
- print_file ( "examples/gvl_sleep.rb" , samples_by_file )
142
+ relevant_files = samples_by_file . select do |k , v |
143
+ next if k . start_with? ( "gem:" )
144
+ next if k . start_with? ( "rubylib:" )
145
+ next if k . start_with? ( "<" )
146
+ v . values . map ( &:total ) . sum > total * 0.01
147
+ end
148
+ relevant_files . keys . sort . each do |filename |
149
+ puts "=" *80
150
+ puts filename
151
+ puts "-" *80
152
+ print_file ( filename , samples_by_file )
153
+ end
154
+ puts "=" *80
158
155
end
159
156
160
157
def self . print_file ( filename , all_samples )
0 commit comments