ruby-prof 0.18.0-x64-mingw32 → 1.1.0-x64-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +32 -0
  3. data/LICENSE +2 -2
  4. data/README.rdoc +1 -483
  5. data/Rakefile +3 -6
  6. data/bin/ruby-prof +65 -30
  7. data/ext/ruby_prof/extconf.rb +6 -38
  8. data/ext/ruby_prof/rp_allocation.c +279 -0
  9. data/ext/ruby_prof/rp_allocation.h +31 -0
  10. data/ext/ruby_prof/rp_call_info.c +129 -283
  11. data/ext/ruby_prof/rp_call_info.h +16 -34
  12. data/ext/ruby_prof/rp_measure_allocations.c +25 -49
  13. data/ext/ruby_prof/rp_measure_memory.c +21 -56
  14. data/ext/ruby_prof/rp_measure_process_time.c +35 -39
  15. data/ext/ruby_prof/rp_measure_wall_time.c +36 -19
  16. data/ext/ruby_prof/rp_measurement.c +230 -0
  17. data/ext/ruby_prof/rp_measurement.h +50 -0
  18. data/ext/ruby_prof/rp_method.c +389 -389
  19. data/ext/ruby_prof/rp_method.h +34 -39
  20. data/ext/ruby_prof/rp_profile.c +895 -0
  21. data/ext/ruby_prof/rp_profile.h +37 -0
  22. data/ext/ruby_prof/rp_stack.c +103 -80
  23. data/ext/ruby_prof/rp_stack.h +5 -12
  24. data/ext/ruby_prof/rp_thread.c +143 -83
  25. data/ext/ruby_prof/rp_thread.h +15 -6
  26. data/ext/ruby_prof/ruby_prof.c +11 -757
  27. data/ext/ruby_prof/ruby_prof.h +4 -47
  28. data/ext/ruby_prof/vc/ruby_prof.vcxproj +10 -8
  29. data/lib/{2.6.3 → 2.6.5}/ruby_prof.so +0 -0
  30. data/lib/ruby-prof.rb +2 -18
  31. data/lib/ruby-prof/assets/call_stack_printer.html.erb +713 -0
  32. data/lib/ruby-prof/assets/call_stack_printer.png +0 -0
  33. data/lib/ruby-prof/assets/graph_printer.html.erb +356 -0
  34. data/lib/ruby-prof/call_info.rb +35 -93
  35. data/lib/ruby-prof/call_info_visitor.rb +19 -21
  36. data/lib/ruby-prof/compatibility.rb +37 -107
  37. data/lib/ruby-prof/exclude_common_methods.rb +198 -0
  38. data/lib/ruby-prof/measurement.rb +14 -0
  39. data/lib/ruby-prof/method_info.rb +52 -83
  40. data/lib/ruby-prof/printers/abstract_printer.rb +73 -50
  41. data/lib/ruby-prof/printers/call_info_printer.rb +13 -3
  42. data/lib/ruby-prof/printers/call_stack_printer.rb +62 -145
  43. data/lib/ruby-prof/printers/call_tree_printer.rb +20 -12
  44. data/lib/ruby-prof/printers/dot_printer.rb +5 -5
  45. data/lib/ruby-prof/printers/flat_printer.rb +6 -24
  46. data/lib/ruby-prof/printers/graph_html_printer.rb +6 -192
  47. data/lib/ruby-prof/printers/graph_printer.rb +13 -15
  48. data/lib/ruby-prof/printers/multi_printer.rb +66 -23
  49. data/lib/ruby-prof/profile.rb +10 -3
  50. data/lib/ruby-prof/rack.rb +0 -3
  51. data/lib/ruby-prof/thread.rb +12 -12
  52. data/lib/ruby-prof/version.rb +1 -1
  53. data/ruby-prof.gemspec +2 -2
  54. data/test/abstract_printer_test.rb +0 -27
  55. data/test/alias_test.rb +129 -0
  56. data/test/basic_test.rb +41 -40
  57. data/test/call_info_visitor_test.rb +3 -3
  58. data/test/dynamic_method_test.rb +0 -2
  59. data/test/fiber_test.rb +11 -17
  60. data/test/gc_test.rb +96 -0
  61. data/test/line_number_test.rb +120 -39
  62. data/test/marshal_test.rb +119 -0
  63. data/test/measure_allocations.rb +30 -0
  64. data/test/measure_allocations_test.rb +371 -12
  65. data/test/measure_allocations_trace_test.rb +385 -0
  66. data/test/measure_memory_trace_test.rb +756 -0
  67. data/test/measure_process_time_test.rb +821 -33
  68. data/test/measure_times.rb +54 -0
  69. data/test/measure_wall_time_test.rb +349 -145
  70. data/test/multi_printer_test.rb +1 -34
  71. data/test/parser_timings.rb +24 -0
  72. data/test/pause_resume_test.rb +5 -5
  73. data/test/prime.rb +2 -0
  74. data/test/printer_call_stack_test.rb +28 -0
  75. data/test/printer_call_tree_test.rb +31 -0
  76. data/test/printer_flat_test.rb +68 -0
  77. data/test/printer_graph_html_test.rb +60 -0
  78. data/test/printer_graph_test.rb +41 -0
  79. data/test/printers_test.rb +32 -166
  80. data/test/printing_recursive_graph_test.rb +26 -72
  81. data/test/recursive_test.rb +72 -77
  82. data/test/stack_printer_test.rb +2 -15
  83. data/test/start_stop_test.rb +22 -25
  84. data/test/test_helper.rb +5 -248
  85. data/test/thread_test.rb +11 -54
  86. data/test/unique_call_path_test.rb +16 -28
  87. data/test/yarv_test.rb +1 -0
  88. metadata +28 -36
  89. data/examples/flat.txt +0 -50
  90. data/examples/graph.dot +0 -84
  91. data/examples/graph.html +0 -823
  92. data/examples/graph.txt +0 -139
  93. data/examples/multi.flat.txt +0 -23
  94. data/examples/multi.graph.html +0 -760
  95. data/examples/multi.grind.dat +0 -114
  96. data/examples/multi.stack.html +0 -547
  97. data/examples/stack.html +0 -547
  98. data/ext/ruby_prof/rp_measure.c +0 -40
  99. data/ext/ruby_prof/rp_measure.h +0 -45
  100. data/ext/ruby_prof/rp_measure_cpu_time.c +0 -136
  101. data/ext/ruby_prof/rp_measure_gc_runs.c +0 -73
  102. data/ext/ruby_prof/rp_measure_gc_time.c +0 -60
  103. data/lib/ruby-prof/aggregate_call_info.rb +0 -76
  104. data/lib/ruby-prof/assets/call_stack_printer.css.html +0 -117
  105. data/lib/ruby-prof/assets/call_stack_printer.js.html +0 -385
  106. data/lib/ruby-prof/printers/flat_printer_with_line_numbers.rb +0 -83
  107. data/lib/ruby-prof/profile/exclude_common_methods.rb +0 -207
  108. data/lib/ruby-prof/profile/legacy_method_elimination.rb +0 -50
  109. data/test/aggregate_test.rb +0 -136
  110. data/test/block_test.rb +0 -74
  111. data/test/call_info_test.rb +0 -78
  112. data/test/issue137_test.rb +0 -63
  113. data/test/measure_cpu_time_test.rb +0 -212
  114. data/test/measure_gc_runs_test.rb +0 -32
  115. data/test/measure_gc_time_test.rb +0 -36
  116. data/test/measure_memory_test.rb +0 -33
  117. data/test/method_elimination_test.rb +0 -84
  118. data/test/module_test.rb +0 -45
  119. data/test/stack_test.rb +0 -138
@@ -1,385 +0,0 @@
1
- <script type="text/javascript">
2
- /*
3
- Copyright (C) 2005,2009 Stefan Kaes
4
- skaes@railsexpress.de
5
- */
6
-
7
- function rootNode() {
8
- return currentThread;
9
- }
10
-
11
- function showUL(node, show) {
12
- var lis = node.childNodes;
13
- var l = lis.length;
14
- for (var i=0; i < l ; i++ ) {
15
- toggle(lis[i], show);
16
- }
17
- }
18
-
19
- function findUlChild(li){
20
- var ul = li.childNodes[2];
21
- while (ul && ul.nodeName != "UL") {
22
- ul = ul.nextSibling;
23
- }
24
- return ul;
25
- }
26
-
27
- function isLeafNode(li) {
28
- var img = li.firstChild;
29
- return (img.className.indexOf('empty') > -1);
30
- }
31
-
32
- function toggle(li, show) {
33
- if (isLeafNode(li))
34
- return;
35
-
36
- var img = li.firstChild;
37
- img.className = 'toggle ';
38
- img.className += show ? 'minus' : 'plus';
39
-
40
- var ul = findUlChild(li);
41
- if (ul) {
42
- ul.style.display = show ? 'block' : 'none';
43
- showUL(ul, true);
44
- }
45
- }
46
-
47
- function toggleLI(li) {
48
- var img = li.firstChild;
49
- if (img.className.indexOf("minus")>-1)
50
- toggle(li, false);
51
- else {
52
- if (img.className.indexOf("plus")>-1)
53
- toggle(li, true);
54
- }
55
- }
56
-
57
- function aboveThreshold(text, threshold) {
58
- var match = text.match(/\d+[.,]\d+/);
59
- return (match && parseFloat(match[0].replace(/,/, '.'))>=threshold);
60
- }
61
-
62
- function setThresholdLI(li, threshold) {
63
- var img = li.firstChild;
64
- var text = img.nextSibling.firstChild;
65
- var ul = findUlChild(li);
66
-
67
- var visible = aboveThreshold(text.nodeValue, threshold) ? 1 : 0;
68
-
69
- var count = 0;
70
- if (ul) {
71
- count = setThresholdUL(ul, threshold);
72
- }
73
- if (count>0) {
74
- img.className = 'toggle minus';
75
- }
76
- else {
77
- img.className = 'toggle empty';
78
- }
79
- if (visible) {
80
- li.style.display = 'block'
81
- }
82
- else {
83
- li.style.display = 'none'
84
- }
85
- return visible;
86
- }
87
-
88
- function setThresholdUL(node, threshold) {
89
- var lis = node.childNodes;
90
- var l = lis.length;
91
-
92
- var count = 0;
93
- for ( var i = 0; i < l ; i++ ) {
94
- count = count + setThresholdLI(lis[i], threshold);
95
- }
96
-
97
- var visible = (count > 0) ? 1 : 0;
98
- if (visible) {
99
- node.style.display = 'block';
100
- }
101
- else {
102
- node.style.display = 'none';
103
- }
104
- return visible;
105
- }
106
-
107
- function toggleChildren(img, event) {
108
- event.cancelBubble=true;
109
- if (img.className.indexOf('empty') > -1)
110
- return;
111
-
112
- var minus = (img.className.indexOf('minus') > -1);
113
-
114
- if (minus) {
115
- img.className = 'toggle plus';
116
- }
117
- else
118
- img.className = 'toggle minus';
119
-
120
- var li = img.parentNode;
121
- var ul = findUlChild(li);
122
- if (ul) {
123
- if (minus)
124
- ul.style.display = 'none';
125
- else
126
- ul.style.display = 'block';
127
- }
128
- if (minus)
129
- moveSelectionIfNecessary(li);
130
- }
131
-
132
- function showChildren(li) {
133
- var img = li.firstChild;
134
- if (img.className.indexOf('empty') > -1)
135
- return;
136
- img.className = 'toggle minus';
137
-
138
- var ul = findUlChild(li);
139
- if (ul) {
140
- ul.style.display = 'block';
141
- }
142
- }
143
-
144
- function setThreshold() {
145
- var tv = document.getElementById("threshold").value;
146
- if (tv.match(/[0-9]+([.,][0-9]+)?/)) {
147
- var f = parseFloat(tv.replace(/,/, '.'));
148
- var threads = document.getElementsByName("thread");
149
- var l = threads.length;
150
- for ( var i = 0; i < l ; i++ ) {
151
- setThresholdUL(threads[i], f);
152
- }
153
- var p = selectedNode;
154
- while (p && p.style.display=='none')
155
- p=p.parentNode.parentNode;
156
- if (p && p.nodeName=="LI")
157
- selectNode(p);
158
- }
159
- else {
160
- alert("Please specify a decimal number as threshold value!");
161
- }
162
- }
163
-
164
- function expandAll(event) {
165
- toggleAll(event, true);
166
- }
167
-
168
- function collapseAll(event) {
169
- toggleAll(event, false);
170
- selectNode(rootNode(), null);
171
- }
172
-
173
- function toggleAll(event, show) {
174
- event.cancelBubble=true;
175
- var threads = document.getElementsByName("thread");
176
- var l = threads.length;
177
- for ( var i = 0; i < l ; i++ ) {
178
- showUL(threads[i], show);
179
- }
180
- }
181
-
182
- function toggleHelp(node) {
183
- var help = document.getElementById("help");
184
- if (node.value == "Show Help") {
185
- node.value = "Hide Help";
186
- help.style.display = 'block';
187
- }
188
- else {
189
- node.value = "Show Help";
190
- help.style.display = 'none';
191
- }
192
- }
193
-
194
- var selectedNode = null;
195
- var selectedColor = null;
196
- var selectedThread = null;
197
-
198
- function descendentOf(a,b){
199
- while (a!=b && b!=null)
200
- b=b.parentNode;
201
- return (a==b);
202
- }
203
-
204
- function moveSelectionIfNecessary(node){
205
- if (descendentOf(node, selectedNode))
206
- selectNode(node, null);
207
- }
208
-
209
- function selectNode(node, event) {
210
- if (event) {
211
- event.cancelBubble = true;
212
- thread = findThread(node);
213
- selectThread(thread);
214
- }
215
- if (selectedNode) {
216
- selectedNode.style.background = selectedColor;
217
- }
218
- selectedNode = node;
219
- selectedColor = node.style.background;
220
- selectedNode.style.background = "red";
221
- selectedNode.scrollIntoView();
222
- window.scrollBy(0,-400);
223
- }
224
-
225
- function moveUp(){
226
- move(selectedNode.previousSibling);
227
- }
228
-
229
- function moveDown(){
230
- move(selectedNode.nextSibling);
231
- }
232
-
233
- function move(p) {
234
- while (p && p.style.display == 'none')
235
- p = p.nextSibling;
236
- if (p && p.nodeName == "LI") {
237
- selectNode(p, null);
238
- }
239
- }
240
-
241
- function moveLeft(){
242
- var p = selectedNode.parentNode.parentNode;
243
- if (p && p.nodeName=="LI") {
244
- selectNode(p, null);
245
- }
246
- }
247
-
248
- function moveRight(){
249
- if (!isLeafNode(selectedNode)) {
250
- showChildren(selectedNode);
251
- var ul = findUlChild(selectedNode);
252
- if (ul) {
253
- selectNode(ul.firstChild, null);
254
- }
255
- }
256
- }
257
-
258
- function moveForward(){
259
- if (isLeafNode(selectedNode)) {
260
- var p = selectedNode;
261
- while ((p.nextSibling == null || p.nextSibling.style.display=='none') && p.nodeName=="LI") {
262
- p = p.parentNode.parentNode;
263
- }
264
- if (p.nodeName=="LI")
265
- selectNode(p.nextSibling, null);
266
- }
267
- else {
268
- moveRight();
269
- }
270
- }
271
-
272
- function isExpandedNode(li){
273
- var img = li.firstChild;
274
- return(img.className.indexOf('minus')>-1);
275
- }
276
-
277
- function moveBackward(){
278
- var p = selectedNode;
279
- var q = p.previousSibling;
280
- while (q != null && q.style.display=='none')
281
- q = q.previousSibling;
282
- if (q == null) {
283
- p = p.parentNode.parentNode;
284
- } else {
285
- while (!isLeafNode(q) && isExpandedNode(q)) {
286
- q = findUlChild(q).lastChild;
287
- while (q.style.display=='none')
288
- q = q.previousSibling;
289
- }
290
- p = q;
291
- }
292
- if (p.nodeName=="LI")
293
- selectNode(p, null);
294
- }
295
-
296
- function moveHome() {
297
- selectNode(currentThread);
298
- }
299
-
300
- var currentThreadIndex = null;
301
-
302
- function findThread(node){
303
- while (node && !node.parentNode.nodeName.match(/BODY|DIV/g)) {
304
- node = node.parentNode;
305
- }
306
- return node.firstChild;
307
- }
308
-
309
- function selectThread(node){
310
- var threads = document.getElementsByName("thread");
311
- currentThread = node;
312
- for (var i=0; i<threads.length; i++) {
313
- if (threads[i]==currentThread.parentNode)
314
- currentThreadIndex = i;
315
- }
316
- }
317
-
318
- function nextThread(){
319
- var threads = document.getElementsByName("thread");
320
- if (currentThreadIndex==threads.length-1)
321
- currentThreadIndex = 0;
322
- else
323
- currentThreadIndex += 1
324
- currentThread = threads[currentThreadIndex].firstChild;
325
- selectNode(currentThread, null);
326
- }
327
-
328
- function previousThread(){
329
- var threads = document.getElementsByName("thread");
330
- if (currentThreadIndex==0)
331
- currentThreadIndex = threads.length-1;
332
- else
333
- currentThreadIndex -= 1
334
- currentThread = threads[currentThreadIndex].firstChild;
335
- selectNode(currentThread, null);
336
- }
337
-
338
- function switchThread(node, event){
339
- event.cancelBubble = true;
340
- selectThread(node.nextSibling.firstChild);
341
- selectNode(currentThread, null);
342
- }
343
-
344
- function handleKeyEvent(event){
345
- var code = event.charCode ? event.charCode : event.keyCode;
346
- var str = String.fromCharCode(code);
347
- switch (str) {
348
- case "a": moveLeft(); break;
349
- case "s": moveDown(); break;
350
- case "d": moveRight(); break;
351
- case "w": moveUp(); break;
352
- case "f": moveForward(); break;
353
- case "b": moveBackward(); break;
354
- case "x": toggleChildren(selectedNode.firstChild, event); break;
355
- case "*": toggleLI(selectedNode); break;
356
- case "n": nextThread(); break;
357
- case "h": moveHome(); break;
358
- case "p": previousThread(); break;
359
- }
360
- }
361
- document.onkeypress=function(event){ handleKeyEvent(event) };
362
-
363
- window.onload=function(){
364
- var images = document.querySelectorAll(".toggle");
365
- for (var i=0; i<images.length; i++) {
366
- var img = images[i];
367
- img.onclick = function(event){ toggleChildren(this, event); return false; };
368
- }
369
- var divs = document.getElementsByTagName("div");
370
- for (i=0; i<divs.length; i++) {
371
- var div = divs[i];
372
- if (div.className == "thread")
373
- div.onclick = function(event){ switchThread(this, event) };
374
- }
375
- var lis = document.getElementsByTagName("li");
376
- for (var i=0; i<lis.length; i++) {
377
- lis[i].onclick = function(event){ selectNode(this, event); };
378
- }
379
- var threads = document.getElementsByName("thread");;
380
- currentThreadIndex = 0;
381
- currentThread = threads[0].firstChild;
382
- selectNode(currentThread, null);
383
- };
384
-
385
- </script>
@@ -1,83 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module RubyProf
4
- # Generates flat[link:files/examples/flat_txt.html] profile reports as text.
5
- # To use the flat printer with line numbers:
6
- #
7
- # result = RubyProf.profile do
8
- # [code to profile]
9
- # end
10
- #
11
- # printer = RubyProf::FlatPrinterWithLineNumbers.new(result)
12
- # printer.print(STDOUT, {})
13
- #
14
- class FlatPrinterWithLineNumbers < FlatPrinter
15
- def print_methods(thread)
16
- @editor = editor_uri
17
- total_time = thread.total_time
18
-
19
- methods = thread.methods.sort_by(&sort_method).reverse
20
- sum = 0
21
- methods.each do |method|
22
- self_percent = (method.self_time / total_time) * 100
23
- next if self_percent < min_percent
24
-
25
- sum += method.self_time
26
- #self_time_called = method.called > 0 ? method.self_time/method.called : 0
27
- #total_time_called = method.called > 0? method.total_time/method.called : 0
28
-
29
- @output << "%6.2f %9.3f %9.3f %9.3f %9.3f %8d %s%s" % [
30
- method.self_time / total_time * 100, # %self
31
- method.total_time, # total
32
- method.self_time, # self
33
- method.wait_time, # wait
34
- method.children_time, # children
35
- method.called, # calls
36
- method.recursive? ? "*" : " ", # cycle
37
- method_name(method) # name
38
- ]
39
- if method.source_file == 'ruby_runtime'
40
- @output << "\n"
41
- else
42
- @output << "\n defined at:\n"
43
- @output << defined_at_format % [File.expand_path(method.source_file), method.line]
44
- end
45
-
46
- callers = []
47
- method.call_infos.each do |ci|
48
- if ci.parent && ci.parent.target.source_file != 'ruby_runtime'
49
- callers << [method_name(ci.parent.target), File.expand_path(ci.parent.target.source_file), ci.parent.target.line]
50
- end
51
- end
52
- # make sure callers are unique
53
- callers.uniq!
54
-
55
- unless callers.empty?
56
- @output << " called from:\n"
57
- callers.each do |args|
58
- @output << called_from_format % args
59
- end
60
- end
61
- @output << "\n"
62
- end
63
- end
64
-
65
- private
66
-
67
- def defined_at_format
68
- if @editor
69
- " #{@editor}://open?url=file://%s&line=%s\n"
70
- else
71
- " %s:%s\n"
72
- end
73
- end
74
-
75
- def called_from_format
76
- if @editor
77
- " %s (#{@editor}://open?url=file://%s&line=%s)\n"
78
- else
79
- " %s (%s:%s)\n"
80
- end
81
- end
82
- end
83
- end