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

Sign up to get free protection for your applications and to get access to all the features.
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