ruby-prof 1.7.2 → 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 (121) hide show
  1. checksums.yaml +4 -4
  2. data/{CHANGES → CHANGELOG.md} +112 -178
  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/rp_allocation.c +0 -15
  35. data/ext/ruby_prof/rp_allocation.h +29 -33
  36. data/ext/ruby_prof/rp_call_tree.c +3 -0
  37. data/ext/ruby_prof/rp_call_tree.h +1 -4
  38. data/ext/ruby_prof/rp_call_trees.h +1 -4
  39. data/ext/ruby_prof/rp_measurement.c +0 -5
  40. data/ext/ruby_prof/rp_measurement.h +49 -53
  41. data/ext/ruby_prof/rp_method.c +3 -0
  42. data/ext/ruby_prof/rp_method.h +1 -4
  43. data/ext/ruby_prof/rp_profile.c +1 -1
  44. data/ext/ruby_prof/rp_profile.h +1 -5
  45. data/ext/ruby_prof/rp_stack.h +50 -53
  46. data/ext/ruby_prof/rp_thread.h +1 -4
  47. data/ext/ruby_prof/ruby_prof.h +1 -4
  48. data/ext/ruby_prof/vc/ruby_prof.vcxproj +7 -8
  49. data/lib/ruby-prof/assets/call_stack_printer.html.erb +746 -711
  50. data/lib/ruby-prof/assets/flame_graph_printer.html.erb +412 -0
  51. data/lib/ruby-prof/assets/graph_printer.html.erb +355 -355
  52. data/lib/ruby-prof/call_tree.rb +57 -57
  53. data/lib/ruby-prof/call_tree_visitor.rb +36 -36
  54. data/lib/ruby-prof/measurement.rb +17 -17
  55. data/lib/ruby-prof/printers/abstract_printer.rb +19 -33
  56. data/lib/ruby-prof/printers/call_info_printer.rb +53 -53
  57. data/lib/ruby-prof/printers/call_stack_printer.rb +168 -180
  58. data/lib/ruby-prof/printers/call_tree_printer.rb +132 -145
  59. data/lib/ruby-prof/printers/dot_printer.rb +177 -132
  60. data/lib/ruby-prof/printers/flame_graph_printer.rb +79 -0
  61. data/lib/ruby-prof/printers/flat_printer.rb +52 -52
  62. data/lib/ruby-prof/printers/graph_html_printer.rb +62 -63
  63. data/lib/ruby-prof/printers/graph_printer.rb +112 -113
  64. data/lib/ruby-prof/printers/multi_printer.rb +134 -127
  65. data/lib/ruby-prof/profile.rb +13 -0
  66. data/lib/ruby-prof/rack.rb +114 -105
  67. data/lib/ruby-prof/task.rb +147 -147
  68. data/lib/ruby-prof/thread.rb +20 -20
  69. data/lib/ruby-prof/version.rb +1 -1
  70. data/lib/ruby-prof.rb +50 -52
  71. data/lib/unprof.rb +10 -10
  72. data/ruby-prof.gemspec +5 -5
  73. data/test/abstract_printer_test.rb +25 -27
  74. data/test/alias_test.rb +203 -117
  75. data/test/call_tree_builder.rb +126 -126
  76. data/test/call_tree_visitor_test.rb +27 -27
  77. data/test/call_trees_test.rb +66 -66
  78. data/test/duplicate_names_test.rb +32 -32
  79. data/test/dynamic_method_test.rb +50 -50
  80. data/test/exceptions_test.rb +24 -24
  81. data/test/exclude_threads_test.rb +48 -48
  82. data/test/fiber_test.rb +72 -72
  83. data/test/inverse_call_tree_test.rb +174 -174
  84. data/test/line_number_test.rb +138 -1
  85. data/test/marshal_test.rb +144 -145
  86. data/test/measure_allocations.rb +26 -26
  87. data/test/measure_allocations_test.rb +340 -1
  88. data/test/measure_process_time_test.rb +3098 -3142
  89. data/test/measure_times.rb +56 -56
  90. data/test/measure_wall_time_test.rb +511 -372
  91. data/test/measurement_test.rb +82 -82
  92. data/test/merge_test.rb +48 -48
  93. data/test/multi_printer_test.rb +52 -66
  94. data/test/no_method_class_test.rb +15 -15
  95. data/test/pause_resume_test.rb +171 -171
  96. data/test/prime.rb +54 -54
  97. data/test/prime_script.rb +5 -5
  98. data/test/printer_call_stack_test.rb +28 -27
  99. data/test/printer_call_tree_test.rb +30 -30
  100. data/test/printer_flame_graph_test.rb +82 -0
  101. data/test/printer_flat_test.rb +99 -99
  102. data/test/printer_graph_html_test.rb +62 -59
  103. data/test/printer_graph_test.rb +42 -40
  104. data/test/printers_test.rb +28 -44
  105. data/test/printing_recursive_graph_test.rb +81 -81
  106. data/test/profile_test.rb +101 -101
  107. data/test/rack_test.rb +103 -93
  108. data/test/recursive_test.rb +139 -139
  109. data/test/scheduler.rb +4 -0
  110. data/test/singleton_test.rb +39 -38
  111. data/test/stack_printer_test.rb +61 -61
  112. data/test/start_stop_test.rb +106 -106
  113. data/test/test_helper.rb +4 -0
  114. data/test/thread_test.rb +29 -29
  115. data/test/unique_call_path_test.rb +123 -123
  116. data/test/yarv_test.rb +56 -56
  117. metadata +53 -11
  118. data/ext/ruby_prof/rp_measure_memory.c +0 -46
  119. data/lib/ruby-prof/compatibility.rb +0 -113
  120. data/test/compatibility_test.rb +0 -49
  121. data/test/measure_memory_test.rb +0 -1193
@@ -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
+