ruby-prof 1.7.1 → 2.0.0

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 (134) hide show
  1. checksums.yaml +4 -4
  2. data/{CHANGES → CHANGELOG.md} +118 -176
  3. data/README.md +5 -5
  4. data/bin/ruby-prof +1 -4
  5. data/docs/advanced-usage.md +132 -0
  6. data/docs/alternatives.md +98 -0
  7. data/docs/architecture.md +122 -0
  8. data/docs/best-practices.md +27 -0
  9. data/docs/getting-started.md +130 -0
  10. data/docs/history.md +11 -0
  11. data/docs/index.md +45 -0
  12. data/docs/profiling-rails.md +64 -0
  13. data/docs/public/examples/example.rb +33 -0
  14. data/docs/public/examples/generate_reports.rb +92 -0
  15. data/docs/public/examples/reports/call_info.txt +27 -0
  16. data/docs/public/examples/reports/call_stack.html +835 -0
  17. data/docs/public/examples/reports/callgrind.out +150 -0
  18. data/docs/public/examples/reports/flame_graph.html +408 -0
  19. data/docs/public/examples/reports/flat.txt +45 -0
  20. data/docs/public/examples/reports/graph.dot +129 -0
  21. data/docs/public/examples/reports/graph.html +1319 -0
  22. data/docs/public/examples/reports/graph.txt +100 -0
  23. data/docs/public/examples/reports/graphviz_viewer.html +1 -0
  24. data/docs/public/images/call_stack.png +0 -0
  25. data/docs/public/images/class_diagram.png +0 -0
  26. data/docs/public/images/dot_printer.png +0 -0
  27. data/docs/public/images/flame_graph.png +0 -0
  28. data/docs/public/images/flat.png +0 -0
  29. data/docs/public/images/graph.png +0 -0
  30. data/docs/public/images/graph_html.png +0 -0
  31. data/docs/public/images/ruby-prof-logo.svg +1 -0
  32. data/docs/reports.md +150 -0
  33. data/docs/stylesheets/extra.css +80 -0
  34. data/ext/ruby_prof/extconf.rb +23 -22
  35. data/ext/ruby_prof/rp_allocation.c +0 -15
  36. data/ext/ruby_prof/rp_allocation.h +29 -33
  37. data/ext/ruby_prof/rp_call_tree.c +3 -0
  38. data/ext/ruby_prof/rp_call_tree.h +1 -4
  39. data/ext/ruby_prof/rp_call_trees.c +296 -296
  40. data/ext/ruby_prof/rp_call_trees.h +25 -28
  41. data/ext/ruby_prof/rp_measure_allocations.c +47 -47
  42. data/ext/ruby_prof/rp_measure_process_time.c +64 -66
  43. data/ext/ruby_prof/rp_measure_wall_time.c +52 -64
  44. data/ext/ruby_prof/rp_measurement.c +0 -5
  45. data/ext/ruby_prof/rp_measurement.h +49 -53
  46. data/ext/ruby_prof/rp_method.c +554 -551
  47. data/ext/ruby_prof/rp_method.h +1 -4
  48. data/ext/ruby_prof/rp_profile.c +1 -1
  49. data/ext/ruby_prof/rp_profile.h +1 -5
  50. data/ext/ruby_prof/rp_stack.c +212 -212
  51. data/ext/ruby_prof/rp_stack.h +50 -53
  52. data/ext/ruby_prof/rp_thread.h +1 -4
  53. data/ext/ruby_prof/ruby_prof.c +50 -50
  54. data/ext/ruby_prof/ruby_prof.h +4 -6
  55. data/ext/ruby_prof/vc/ruby_prof.vcxproj +7 -8
  56. data/lib/ruby-prof/assets/call_stack_printer.html.erb +746 -711
  57. data/lib/ruby-prof/assets/flame_graph_printer.html.erb +412 -0
  58. data/lib/ruby-prof/assets/graph_printer.html.erb +355 -355
  59. data/lib/ruby-prof/call_tree.rb +57 -57
  60. data/lib/ruby-prof/call_tree_visitor.rb +36 -36
  61. data/lib/ruby-prof/exclude_common_methods.rb +204 -204
  62. data/lib/ruby-prof/measurement.rb +17 -17
  63. data/lib/ruby-prof/printers/abstract_printer.rb +142 -138
  64. data/lib/ruby-prof/printers/call_info_printer.rb +53 -53
  65. data/lib/ruby-prof/printers/call_stack_printer.rb +168 -180
  66. data/lib/ruby-prof/printers/call_tree_printer.rb +132 -145
  67. data/lib/ruby-prof/printers/dot_printer.rb +177 -132
  68. data/lib/ruby-prof/printers/flame_graph_printer.rb +79 -0
  69. data/lib/ruby-prof/printers/flat_printer.rb +52 -52
  70. data/lib/ruby-prof/printers/graph_html_printer.rb +62 -63
  71. data/lib/ruby-prof/printers/graph_printer.rb +112 -113
  72. data/lib/ruby-prof/printers/multi_printer.rb +134 -127
  73. data/lib/ruby-prof/profile.rb +13 -0
  74. data/lib/ruby-prof/rack.rb +114 -105
  75. data/lib/ruby-prof/task.rb +147 -147
  76. data/lib/ruby-prof/thread.rb +20 -20
  77. data/lib/ruby-prof/version.rb +3 -3
  78. data/lib/ruby-prof.rb +50 -52
  79. data/lib/unprof.rb +10 -10
  80. data/ruby-prof.gemspec +66 -65
  81. data/test/abstract_printer_test.rb +25 -27
  82. data/test/alias_test.rb +203 -117
  83. data/test/call_tree_builder.rb +126 -126
  84. data/test/call_tree_visitor_test.rb +27 -27
  85. data/test/call_trees_test.rb +66 -66
  86. data/test/duplicate_names_test.rb +32 -32
  87. data/test/dynamic_method_test.rb +50 -62
  88. data/test/enumerable_test.rb +23 -21
  89. data/test/exceptions_test.rb +24 -24
  90. data/test/exclude_methods_test.rb +363 -257
  91. data/test/exclude_threads_test.rb +48 -48
  92. data/test/fiber_test.rb +195 -195
  93. data/test/gc_test.rb +104 -102
  94. data/test/inverse_call_tree_test.rb +174 -174
  95. data/test/line_number_test.rb +563 -289
  96. data/test/marshal_test.rb +144 -145
  97. data/test/measure_allocations.rb +26 -26
  98. data/test/measure_allocations_test.rb +1511 -1081
  99. data/test/measure_process_time_test.rb +3286 -2477
  100. data/test/measure_times.rb +56 -56
  101. data/test/measure_wall_time_test.rb +773 -568
  102. data/test/measurement_test.rb +82 -82
  103. data/test/merge_test.rb +146 -146
  104. data/test/method_info_test.rb +100 -95
  105. data/test/multi_printer_test.rb +52 -66
  106. data/test/no_method_class_test.rb +15 -15
  107. data/test/pause_resume_test.rb +171 -171
  108. data/test/prime.rb +54 -54
  109. data/test/prime_script.rb +5 -5
  110. data/test/printer_call_stack_test.rb +28 -27
  111. data/test/printer_call_tree_test.rb +30 -30
  112. data/test/printer_flame_graph_test.rb +82 -0
  113. data/test/printer_flat_test.rb +99 -99
  114. data/test/printer_graph_html_test.rb +62 -59
  115. data/test/printer_graph_test.rb +42 -40
  116. data/test/printers_test.rb +162 -135
  117. data/test/printing_recursive_graph_test.rb +81 -81
  118. data/test/profile_test.rb +101 -101
  119. data/test/rack_test.rb +103 -93
  120. data/test/recursive_test.rb +796 -622
  121. data/test/scheduler.rb +4 -0
  122. data/test/singleton_test.rb +39 -38
  123. data/test/stack_printer_test.rb +61 -61
  124. data/test/start_stop_test.rb +106 -106
  125. data/test/test_helper.rb +24 -20
  126. data/test/thread_test.rb +229 -231
  127. data/test/unique_call_path_test.rb +123 -136
  128. data/test/yarv_test.rb +56 -60
  129. metadata +68 -16
  130. data/ext/ruby_prof/rp_measure_memory.c +0 -46
  131. data/lib/ruby-prof/compatibility.rb +0 -113
  132. data/test/compatibility_test.rb +0 -49
  133. data/test/crash2.rb +0 -144
  134. data/test/measure_memory_test.rb +0 -1456
@@ -0,0 +1,92 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ # Generates example reports for all ruby-prof printers.
5
+ # Usage: ruby docs/public/examples/generate_reports.rb
6
+
7
+ # To make testing/debugging easier test within this source tree versus an installed gem
8
+ require 'bundler/setup'
9
+
10
+ # Add ext directory to load path to make it easier to test locally built extensions
11
+ ext_path = File.expand_path(File.join(__dir__, '..', '..', '..', 'ext', 'ruby_prof'))
12
+ $LOAD_PATH.unshift(ext_path)
13
+
14
+ require 'fileutils'
15
+ require 'stringio'
16
+ require 'uri'
17
+ require 'ruby-prof'
18
+ require_relative 'example'
19
+
20
+ output_dir = File.join(File.dirname(__FILE__), "reports")
21
+ FileUtils.mkdir_p(output_dir)
22
+
23
+ def sanitize_local_file_links(path)
24
+ content = File.read(path)
25
+ content.gsub!(%r{href="file://[^"]*/docs/public/examples/([^"#]+)#\d+"}, 'href="../\1"')
26
+ content.gsub!(%r{title=".*?/docs/public/examples/([^":]+):\d+"}, 'title="\1"')
27
+ content.gsub!(%r{href="file://[^"]+"}, 'href="#"')
28
+ content.gsub!(%r{title="[^"]*(?:<internal:|&lt;internal:)[^"]+"}, 'title="internal"')
29
+ File.write(path, content)
30
+ end
31
+
32
+ result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do
33
+ run_example
34
+ end
35
+
36
+ # Flame Graph
37
+ File.open(File.join(output_dir, "flame_graph.html"), "wb") do |f|
38
+ RubyProf::FlameGraphPrinter.new(result).print(f)
39
+ end
40
+
41
+ # Call Stack
42
+ File.open(File.join(output_dir, "call_stack.html"), "wb") do |f|
43
+ RubyProf::CallStackPrinter.new(result).print(f)
44
+ end
45
+ sanitize_local_file_links(File.join(output_dir, "call_stack.html"))
46
+
47
+ # Graph HTML
48
+ File.open(File.join(output_dir, "graph.html"), "wb") do |f|
49
+ RubyProf::GraphHtmlPrinter.new(result).print(f)
50
+ end
51
+ sanitize_local_file_links(File.join(output_dir, "graph.html"))
52
+
53
+ # Graph (text)
54
+ File.open(File.join(output_dir, "graph.txt"), "wb") do |f|
55
+ RubyProf::GraphPrinter.new(result).print(f)
56
+ end
57
+
58
+ # Flat
59
+ File.open(File.join(output_dir, "flat.txt"), "wb") do |f|
60
+ RubyProf::FlatPrinter.new(result).print(f)
61
+ end
62
+
63
+ # Call Info
64
+ File.open(File.join(output_dir, "call_info.txt"), "wb") do |f|
65
+ RubyProf::CallInfoPrinter.new(result).print(f)
66
+ end
67
+
68
+ # Dot
69
+ dot_io = StringIO.new
70
+ RubyProf::DotPrinter.new(result).print(dot_io)
71
+ dot_content = dot_io.string
72
+ File.open(File.join(output_dir, "graph.dot"), "wb") do |f|
73
+ f << dot_content
74
+ end
75
+
76
+ # Graphviz Online viewer with dot content embedded in URL
77
+ viewer_url = "https://dreampuf.github.io/GraphvizOnline/?engine=dot#" + URI.encode_uri_component(dot_content)
78
+ File.open(File.join(output_dir, "graphviz_viewer.html"), "wb") do |f|
79
+ f << %(<html><head><meta http-equiv="refresh" content="0;url=#{viewer_url}"></head></html>)
80
+ end
81
+
82
+ # Call Tree (calltree format)
83
+ RubyProf::CallTreePrinter.new(result).print(path: output_dir, profile: "profile")
84
+ # Rename PID-based filename to a stable name
85
+ Dir.glob(File.join(output_dir, "callgrind.out.*")).each do |f|
86
+ FileUtils.mv(f, File.join(output_dir, "callgrind.out"))
87
+ end
88
+
89
+ puts "Reports written to #{output_dir}/"
90
+ Dir.glob(File.join(output_dir, "*")).sort.each do |f|
91
+ puts " #{File.basename(f)}"
92
+ end
@@ -0,0 +1,27 @@
1
+ ----------------------------------------------------
2
+ Thread ID: 464
3
+ Fiber ID: 456
4
+ Total Time: 0.007774999990942888
5
+ Sort by:
6
+
7
+ [global]# (tt:0.01, st:0.00, wt:0.00, ct:0.01, call:1, )
8
+ Object#run_example (tt:0.01, st:0.00, wt:0.00, ct:0.01, call:1, )
9
+ String#* (tt:0.00, st:0.00, wt:0.00, ct:0.00, call:1, )
10
+ Object#normalize (tt:0.00, st:0.00, wt:0.00, ct:0.00, call:1, )
11
+ String#downcase (tt:0.00, st:0.00, wt:0.00, ct:0.00, call:1, )
12
+ String#gsub (tt:0.00, st:0.00, wt:0.00, ct:0.00, call:1, )
13
+ Object#tokenize (tt:0.00, st:0.00, wt:0.00, ct:0.00, call:1, )
14
+ String#split (tt:0.00, st:0.00, wt:0.00, ct:0.00, call:1, )
15
+ Object#count_words (tt:0.01, st:0.00, wt:0.00, ct:0.01, call:1, )
16
+ Hash#initialize (tt:0.00, st:0.00, wt:0.00, ct:0.00, call:1, )
17
+ Array#each (tt:0.01, st:0.00, wt:0.00, ct:0.00, call:1, )
18
+ Hash#[] (tt:0.00, st:0.00, wt:0.00, ct:0.00, call:5800, )
19
+ Integer#+ (tt:0.00, st:0.00, wt:0.00, ct:0.00, call:5800, )
20
+ Hash#[]= (tt:0.00, st:0.00, wt:0.00, ct:0.00, call:5800, )
21
+ Object#top_words (tt:0.00, st:0.00, wt:0.00, ct:0.00, call:1, )
22
+ Enumerable#sort_by (tt:0.00, st:0.00, wt:0.00, ct:0.00, call:1, )
23
+ Hash#each (tt:0.00, st:0.00, wt:0.00, ct:0.00, call:1, )
24
+ Integer#-@ (tt:0.00, st:0.00, wt:0.00, ct:0.00, call:25, )
25
+ Array#take (tt:0.00, st:0.00, wt:0.00, ct:0.00, call:1, )
26
+
27
+