ruby-prof 0.13.1 → 1.4.2

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 (209) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGES +579 -371
  3. data/LICENSE +24 -23
  4. data/README.rdoc +5 -433
  5. data/Rakefile +98 -110
  6. data/bin/ruby-prof +328 -329
  7. data/bin/ruby-prof-check-trace +45 -0
  8. data/ext/ruby_prof/extconf.rb +16 -59
  9. data/ext/ruby_prof/rp_aggregate_call_tree.c +59 -0
  10. data/ext/ruby_prof/rp_aggregate_call_tree.h +13 -0
  11. data/ext/ruby_prof/rp_allocation.c +287 -0
  12. data/ext/ruby_prof/rp_allocation.h +31 -0
  13. data/ext/ruby_prof/rp_call_tree.c +369 -0
  14. data/ext/ruby_prof/rp_call_tree.h +43 -0
  15. data/ext/ruby_prof/rp_call_trees.c +288 -0
  16. data/ext/ruby_prof/rp_call_trees.h +28 -0
  17. data/ext/ruby_prof/rp_measure_allocations.c +50 -65
  18. data/ext/ruby_prof/rp_measure_memory.c +42 -73
  19. data/ext/ruby_prof/rp_measure_process_time.c +65 -71
  20. data/ext/ruby_prof/rp_measure_wall_time.c +64 -42
  21. data/ext/ruby_prof/rp_measurement.c +237 -0
  22. data/ext/ruby_prof/rp_measurement.h +50 -0
  23. data/ext/ruby_prof/rp_method.c +491 -420
  24. data/ext/ruby_prof/rp_method.h +62 -57
  25. data/ext/ruby_prof/rp_profile.c +908 -0
  26. data/ext/ruby_prof/rp_profile.h +35 -0
  27. data/ext/ruby_prof/rp_stack.c +212 -128
  28. data/ext/ruby_prof/rp_stack.h +53 -51
  29. data/ext/ruby_prof/rp_thread.c +362 -268
  30. data/ext/ruby_prof/rp_thread.h +39 -27
  31. data/ext/ruby_prof/ruby_prof.c +52 -695
  32. data/ext/ruby_prof/ruby_prof.h +26 -55
  33. data/ext/ruby_prof/vc/ruby_prof.sln +28 -21
  34. data/ext/ruby_prof/vc/{ruby_prof_20.vcxproj → ruby_prof.vcxproj} +56 -8
  35. data/lib/ruby-prof.rb +52 -67
  36. data/lib/ruby-prof/assets/call_stack_printer.html.erb +710 -0
  37. data/lib/ruby-prof/assets/call_stack_printer.png +0 -0
  38. data/lib/ruby-prof/assets/graph_printer.html.erb +355 -0
  39. data/lib/ruby-prof/call_tree.rb +57 -0
  40. data/lib/ruby-prof/call_tree_visitor.rb +36 -0
  41. data/lib/ruby-prof/compatibility.rb +99 -169
  42. data/lib/ruby-prof/exclude_common_methods.rb +198 -0
  43. data/lib/ruby-prof/measurement.rb +17 -0
  44. data/lib/ruby-prof/method_info.rb +78 -131
  45. data/lib/ruby-prof/printers/abstract_printer.rb +137 -85
  46. data/lib/ruby-prof/printers/call_info_printer.rb +53 -41
  47. data/lib/ruby-prof/printers/call_stack_printer.rb +180 -773
  48. data/lib/ruby-prof/printers/call_tree_printer.rb +151 -92
  49. data/lib/ruby-prof/printers/dot_printer.rb +132 -132
  50. data/lib/ruby-prof/printers/flat_printer.rb +53 -69
  51. data/lib/ruby-prof/printers/graph_html_printer.rb +63 -255
  52. data/lib/ruby-prof/printers/graph_printer.rb +113 -116
  53. data/lib/ruby-prof/printers/multi_printer.rb +127 -56
  54. data/lib/ruby-prof/profile.rb +37 -77
  55. data/lib/ruby-prof/rack.rb +62 -15
  56. data/lib/ruby-prof/task.rb +147 -147
  57. data/lib/ruby-prof/thread.rb +10 -12
  58. data/lib/ruby-prof/version.rb +3 -0
  59. data/lib/unprof.rb +10 -10
  60. data/ruby-prof.gemspec +65 -61
  61. data/test/abstract_printer_test.rb +26 -0
  62. data/test/alias_test.rb +126 -0
  63. data/test/basic_test.rb +43 -128
  64. data/test/call_tree_visitor_test.rb +32 -0
  65. data/test/call_trees_test.rb +66 -0
  66. data/test/duplicate_names_test.rb +32 -32
  67. data/test/dynamic_method_test.rb +53 -74
  68. data/test/enumerable_test.rb +21 -16
  69. data/test/exceptions_test.rb +24 -16
  70. data/test/exclude_methods_test.rb +151 -0
  71. data/test/exclude_threads_test.rb +53 -54
  72. data/test/fiber_test.rb +129 -65
  73. data/test/gc_test.rb +90 -0
  74. data/test/inverse_call_tree_test.rb +175 -0
  75. data/test/line_number_test.rb +158 -71
  76. data/test/marshal_test.rb +113 -0
  77. data/test/measure_allocations.rb +30 -0
  78. data/test/measure_allocations_test.rb +375 -25
  79. data/test/measure_allocations_trace_test.rb +375 -0
  80. data/test/measure_memory_trace_test.rb +1101 -0
  81. data/test/measure_process_time_test.rb +785 -62
  82. data/test/measure_times.rb +56 -0
  83. data/test/measure_wall_time_test.rb +434 -254
  84. data/test/multi_printer_test.rb +71 -82
  85. data/test/no_method_class_test.rb +15 -15
  86. data/test/pause_resume_test.rb +175 -166
  87. data/test/prime.rb +54 -54
  88. data/test/prime_script.rb +6 -0
  89. data/test/printer_call_stack_test.rb +27 -0
  90. data/test/printer_call_tree_test.rb +30 -0
  91. data/test/printer_flat_test.rb +99 -0
  92. data/test/printer_graph_html_test.rb +59 -0
  93. data/test/printer_graph_test.rb +40 -0
  94. data/test/printers_test.rb +141 -257
  95. data/test/printing_recursive_graph_test.rb +81 -0
  96. data/test/profile_test.rb +16 -0
  97. data/test/rack_test.rb +93 -0
  98. data/test/recursive_test.rb +206 -215
  99. data/test/singleton_test.rb +38 -38
  100. data/test/stack_printer_test.rb +64 -78
  101. data/test/start_stop_test.rb +109 -112
  102. data/test/test_helper.rb +13 -115
  103. data/test/thread_test.rb +144 -178
  104. data/test/unique_call_path_test.rb +120 -224
  105. data/test/yarv_test.rb +56 -0
  106. metadata +77 -133
  107. data/doc/LICENSE.html +0 -155
  108. data/doc/README_rdoc.html +0 -648
  109. data/doc/Rack.html +0 -167
  110. data/doc/Rack/RubyProf.html +0 -319
  111. data/doc/RubyProf.html +0 -1000
  112. data/doc/RubyProf/AbstractPrinter.html +0 -580
  113. data/doc/RubyProf/AggregateCallInfo.html +0 -570
  114. data/doc/RubyProf/CallInfo.html +0 -512
  115. data/doc/RubyProf/CallInfoPrinter.html +0 -190
  116. data/doc/RubyProf/CallInfoVisitor.html +0 -332
  117. data/doc/RubyProf/CallStackPrinter.html +0 -1600
  118. data/doc/RubyProf/CallTreePrinter.html +0 -413
  119. data/doc/RubyProf/Cmd.html +0 -669
  120. data/doc/RubyProf/DotPrinter.html +0 -312
  121. data/doc/RubyProf/FlatPrinter.html +0 -229
  122. data/doc/RubyProf/FlatPrinterWithLineNumbers.html +0 -267
  123. data/doc/RubyProf/GraphHtmlPrinter.html +0 -630
  124. data/doc/RubyProf/GraphPrinter.html +0 -209
  125. data/doc/RubyProf/MethodInfo.html +0 -713
  126. data/doc/RubyProf/MultiPrinter.html +0 -407
  127. data/doc/RubyProf/Profile.html +0 -821
  128. data/doc/RubyProf/ProfileTask.html +0 -532
  129. data/doc/RubyProf/Test.html +0 -578
  130. data/doc/RubyProf/Thread.html +0 -262
  131. data/doc/created.rid +0 -32
  132. data/doc/examples/flat_txt.html +0 -191
  133. data/doc/examples/graph_txt.html +0 -305
  134. data/doc/images/add.png +0 -0
  135. data/doc/images/brick.png +0 -0
  136. data/doc/images/brick_link.png +0 -0
  137. data/doc/images/bug.png +0 -0
  138. data/doc/images/bullet_black.png +0 -0
  139. data/doc/images/bullet_toggle_minus.png +0 -0
  140. data/doc/images/bullet_toggle_plus.png +0 -0
  141. data/doc/images/date.png +0 -0
  142. data/doc/images/delete.png +0 -0
  143. data/doc/images/find.png +0 -0
  144. data/doc/images/loadingAnimation.gif +0 -0
  145. data/doc/images/macFFBgHack.png +0 -0
  146. data/doc/images/package.png +0 -0
  147. data/doc/images/page_green.png +0 -0
  148. data/doc/images/page_white_text.png +0 -0
  149. data/doc/images/page_white_width.png +0 -0
  150. data/doc/images/plugin.png +0 -0
  151. data/doc/images/ruby.png +0 -0
  152. data/doc/images/tag_blue.png +0 -0
  153. data/doc/images/tag_green.png +0 -0
  154. data/doc/images/transparent.png +0 -0
  155. data/doc/images/wrench.png +0 -0
  156. data/doc/images/wrench_orange.png +0 -0
  157. data/doc/images/zoom.png +0 -0
  158. data/doc/index.html +0 -647
  159. data/doc/js/darkfish.js +0 -155
  160. data/doc/js/jquery.js +0 -18
  161. data/doc/js/navigation.js +0 -142
  162. data/doc/js/search.js +0 -94
  163. data/doc/js/search_index.js +0 -1
  164. data/doc/js/searcher.js +0 -228
  165. data/doc/rdoc.css +0 -543
  166. data/doc/table_of_contents.html +0 -462
  167. data/examples/empty.png +0 -0
  168. data/examples/flat.txt +0 -55
  169. data/examples/graph.dot +0 -106
  170. data/examples/graph.html +0 -823
  171. data/examples/graph.png +0 -0
  172. data/examples/graph.txt +0 -170
  173. data/examples/minus.png +0 -0
  174. data/examples/multi.flat.txt +0 -23
  175. data/examples/multi.graph.html +0 -906
  176. data/examples/multi.grind.dat +0 -194
  177. data/examples/multi.stack.html +0 -573
  178. data/examples/plus.png +0 -0
  179. data/examples/stack.html +0 -573
  180. data/ext/ruby_prof/rp_call_info.c +0 -407
  181. data/ext/ruby_prof/rp_call_info.h +0 -48
  182. data/ext/ruby_prof/rp_measure.c +0 -48
  183. data/ext/ruby_prof/rp_measure.h +0 -45
  184. data/ext/ruby_prof/rp_measure_cpu_time.c +0 -112
  185. data/ext/ruby_prof/rp_measure_gc_runs.c +0 -65
  186. data/ext/ruby_prof/rp_measure_gc_time.c +0 -57
  187. data/ext/ruby_prof/vc/ruby_prof_18.vcxproj +0 -108
  188. data/ext/ruby_prof/vc/ruby_prof_19.vcxproj +0 -110
  189. data/ext/ruby_prof/version.h +0 -7
  190. data/lib/ruby-prof/aggregate_call_info.rb +0 -72
  191. data/lib/ruby-prof/call_info.rb +0 -89
  192. data/lib/ruby-prof/call_info_visitor.rb +0 -44
  193. data/lib/ruby-prof/images/empty.png +0 -0
  194. data/lib/ruby-prof/images/minus.png +0 -0
  195. data/lib/ruby-prof/images/plus.png +0 -0
  196. data/lib/ruby-prof/printers/flat_printer_with_line_numbers.rb +0 -57
  197. data/lib/ruby-prof/test.rb +0 -150
  198. data/test/aggregate_test.rb +0 -136
  199. data/test/call_info_test.rb +0 -78
  200. data/test/call_info_visitor_test.rb +0 -31
  201. data/test/exec_test.rb +0 -14
  202. data/test/measure_cpu_time_test.rb +0 -220
  203. data/test/measure_gc_runs_test.rb +0 -32
  204. data/test/measure_gc_time_test.rb +0 -36
  205. data/test/measure_memory_test.rb +0 -31
  206. data/test/method_elimination_test.rb +0 -84
  207. data/test/module_test.rb +0 -45
  208. data/test/stack_test.rb +0 -138
  209. data/test/test_suite.rb +0 -37
@@ -0,0 +1,28 @@
1
+ /* Copyright (C) 2005-2013 Shugo Maeda <shugo@ruby-lang.org> and Charlie Savage <cfis@savagexi.com>
2
+ Please see the LICENSE file for copyright and distribution information */
3
+
4
+ #ifndef __RP_CALL_TREES_H__
5
+ #define __RP_CALL_TREES_H__
6
+
7
+ #include "ruby_prof.h"
8
+ #include "rp_call_tree.h"
9
+
10
+ /* Array of call_tree objects */
11
+ typedef struct prof_call_trees_t
12
+ {
13
+ prof_call_tree_t** start;
14
+ prof_call_tree_t** end;
15
+ prof_call_tree_t** ptr;
16
+
17
+ VALUE object;
18
+ } prof_call_trees_t;
19
+
20
+
21
+ void rp_init_call_trees();
22
+ prof_call_trees_t* prof_call_trees_create();
23
+ void prof_call_trees_free(prof_call_trees_t* call_trees);
24
+ prof_call_trees_t* prof_get_call_trees(VALUE self);
25
+ void prof_add_call_tree(prof_call_trees_t* call_trees, prof_call_tree_t* call_tree);
26
+ VALUE prof_call_trees_wrap(prof_call_trees_t* call_trees);
27
+
28
+ #endif //__RP_CALL_TREES_H__
@@ -1,65 +1,50 @@
1
- /* Copyright (C) 2005-2013 Shugo Maeda <shugo@ruby-lang.org> and Charlie Savage <cfis@savagexi.com>
2
- Please see the LICENSE file for copyright and distribution information */
3
-
4
- /* :nodoc: */
5
-
6
- #include "ruby_prof.h"
7
-
8
- static VALUE cMeasureAllocations;
9
-
10
- #if defined(HAVE_RB_OS_ALLOCATED_OBJECTS)
11
- unsigned LONG_LONG rb_os_allocated_objects();
12
- #endif
13
-
14
- #if defined(HAVE_RB_GC_MALLOC_ALLOCATIONS)
15
- unsigned LONG_LONG rb_gc_malloc_allocations();
16
- #endif
17
-
18
- static double
19
- measure_allocations()
20
- {
21
- #if defined(HAVE_RB_OS_ALLOCATED_OBJECTS)
22
- #define MEASURE_ALLOCATIONS_ENABLED Qtrue
23
- return rb_os_allocated_objects();
24
-
25
- #elif defined(HAVE_RB_GC_MALLOC_ALLOCATIONS)
26
- #define MEASURE_ALLOCATIONS_ENABLED Qtrue
27
- return rb_gc_malloc_allocations();
28
-
29
- #else
30
- #define MEASURE_ALLOCATIONS_ENABLED Qfalse
31
- return 0;
32
- #endif
33
- }
34
-
35
-
36
- prof_measurer_t* prof_measurer_allocations()
37
- {
38
- prof_measurer_t* measure = ALLOC(prof_measurer_t);
39
- measure->measure = measure_allocations;
40
- return measure;
41
- }
42
-
43
- /* call-seq:
44
- measure -> int
45
-
46
- Returns the number of Ruby object allocations. */
47
-
48
- static VALUE
49
- prof_measure_allocations(VALUE self)
50
- {
51
- #if defined(HAVE_LONG_LONG)
52
- return ULL2NUM(measure_allocations());
53
- #else
54
- return ULONG2NUM(measure_allocations());
55
- #endif
56
- }
57
-
58
- void rp_init_measure_allocations()
59
- {
60
- rb_define_const(mProf, "ALLOCATIONS", INT2NUM(MEASURE_ALLOCATIONS));
61
- rb_define_const(mProf, "ALLOCATIONS_ENABLED", MEASURE_ALLOCATIONS_ENABLED);
62
-
63
- cMeasureAllocations = rb_define_class_under(mMeasure, "Allocations", rb_cObject);
64
- rb_define_singleton_method(cMeasureAllocations, "measure", prof_measure_allocations, 0);
65
- }
1
+ /* Copyright (C) 2005-2013 Shugo Maeda <shugo@ruby-lang.org> and Charlie Savage <cfis@savagexi.com>
2
+ Please see the LICENSE file for copyright and distribution information */
3
+
4
+ /* :nodoc: */
5
+
6
+ #include "rp_measurement.h"
7
+
8
+ static VALUE cMeasureAllocations;
9
+ VALUE total_allocated_objects_key;
10
+
11
+ static double measure_allocations_via_gc_stats(rb_trace_arg_t* trace_arg)
12
+ {
13
+ return (double)rb_gc_stat(total_allocated_objects_key);
14
+ }
15
+
16
+ static double measure_allocations_via_tracing(rb_trace_arg_t* trace_arg)
17
+ {
18
+ static double result = 0;
19
+
20
+ if (trace_arg)
21
+ {
22
+ rb_event_flag_t event = rb_tracearg_event_flag(trace_arg);
23
+ if (event == RUBY_INTERNAL_EVENT_NEWOBJ)
24
+ result++;
25
+ }
26
+ return result;
27
+ }
28
+
29
+ prof_measurer_t* prof_measurer_allocations(bool track_allocations)
30
+ {
31
+ prof_measurer_t* measure = ALLOC(prof_measurer_t);
32
+ measure->mode = MEASURE_ALLOCATIONS;
33
+ measure->multiplier = 1;
34
+ measure->track_allocations = track_allocations;
35
+
36
+ if (track_allocations)
37
+ measure->measure = measure_allocations_via_tracing;
38
+ else
39
+ measure->measure = measure_allocations_via_gc_stats;
40
+
41
+ return measure;
42
+ }
43
+
44
+ void rp_init_measure_allocations()
45
+ {
46
+ total_allocated_objects_key = ID2SYM(rb_intern("total_allocated_objects"));
47
+ rb_define_const(mProf, "ALLOCATIONS", INT2NUM(MEASURE_ALLOCATIONS));
48
+
49
+ cMeasureAllocations = rb_define_class_under(mMeasure, "Allocations", rb_cObject);
50
+ }
@@ -1,73 +1,42 @@
1
- /* Copyright (C) 2005-2013 Shugo Maeda <shugo@ruby-lang.org> and Charlie Savage <cfis@savagexi.com>
2
- Please see the LICENSE file for copyright and distribution information */
3
-
4
- /* :nodoc: */
5
-
6
- #include "ruby_prof.h"
7
-
8
- static VALUE cMeasureMemory;
9
-
10
-
11
- #if defined(HAVE_RB_GC_ALLOCATED_SIZE)
12
- VALUE rb_gc_allocated_size();
13
- #endif
14
-
15
- #if defined(HAVE_RB_GC_MALLOC_ALLOCATED_SIZE)
16
- size_t rb_gc_malloc_allocated_size();
17
- #endif
18
-
19
- #if defined(HAVE_RB_HEAP_TOTAL_MEM)
20
- //FIXME: did not find the patch to check prototype, assuming it to return size_t
21
- size_t rb_heap_total_mem();
22
- #endif
23
-
24
- static double
25
- measure_memory()
26
- {
27
- #if defined(HAVE_RB_GC_ALLOCATED_SIZE)
28
- #define MEASURE_MEMORY_ENABLED Qtrue
29
- #if defined(HAVE_LONG_LONG)
30
- return NUM2LL(rb_gc_allocated_size()) / 1024.0;
31
- #else
32
- return NUM2ULONG(rb_gc_allocated_size()) / 1024.0;
33
- #endif
34
-
35
- #elif defined(HAVE_RB_GC_MALLOC_ALLOCATED_SIZE)
36
- #define MEASURE_MEMORY_ENABLED Qtrue
37
- return rb_gc_malloc_allocated_size() / 1024.0;
38
-
39
- #elif defined(HAVE_RB_HEAP_TOTAL_MEM)
40
- #define MEASURE_MEMORY_ENABLED Qtrue
41
- return rb_heap_total_mem() / 1024.0;
42
-
43
- #else
44
- #define MEASURE_MEMORY_ENABLED Qfalse
45
- return 0;
46
- #endif
47
- }
48
-
49
- prof_measurer_t* prof_measurer_memory()
50
- {
51
- prof_measurer_t* measure = ALLOC(prof_measurer_t);
52
- measure->measure = measure_memory;
53
- return measure;
54
- }
55
-
56
- /* call-seq:
57
- measure_process_time -> float
58
-
59
- Returns the process time.*/
60
- static VALUE
61
- prof_measure_memory(VALUE self)
62
- {
63
- return rb_float_new(measure_memory());
64
- }
65
-
66
- void rp_init_measure_memory()
67
- {
68
- rb_define_const(mProf, "MEMORY", INT2NUM(MEASURE_MEMORY));
69
- rb_define_const(mProf, "MEMORY_ENABLED", MEASURE_MEMORY_ENABLED);
70
-
71
- cMeasureMemory = rb_define_class_under(mMeasure, "Memory", rb_cObject);
72
- rb_define_singleton_method(cMeasureMemory, "measure", prof_measure_memory, 0);
73
- }
1
+ /* Copyright (C) 2005-2013 Shugo Maeda <shugo@ruby-lang.org> and Charlie Savage <cfis@savagexi.com>
2
+ Please see the LICENSE file for copyright and distribution information */
3
+
4
+ /* :nodoc: */
5
+
6
+ #include "rp_measurement.h"
7
+
8
+ static VALUE cMeasureMemory;
9
+
10
+ static double
11
+ measure_memory_via_tracing(rb_trace_arg_t* trace_arg)
12
+ {
13
+ static double result = 0;
14
+
15
+ if (trace_arg)
16
+ {
17
+ rb_event_flag_t event = rb_tracearg_event_flag(trace_arg);
18
+ if (event == RUBY_INTERNAL_EVENT_NEWOBJ)
19
+ {
20
+ VALUE object = rb_tracearg_object(trace_arg);
21
+ result += rb_obj_memsize_of(object);
22
+ }
23
+ }
24
+ return result;
25
+ }
26
+
27
+ prof_measurer_t* prof_measurer_memory(bool track_allocations)
28
+ {
29
+ prof_measurer_t* measure = ALLOC(prof_measurer_t);
30
+ measure->mode = MEASURE_MEMORY;
31
+ measure->measure = measure_memory_via_tracing;
32
+ measure->multiplier = 1;
33
+ measure->track_allocations = true;
34
+ return measure;
35
+ }
36
+
37
+ void rp_init_measure_memory()
38
+ {
39
+ rb_define_const(mProf, "MEMORY", INT2NUM(MEASURE_MEMORY));
40
+
41
+ cMeasureMemory = rb_define_class_under(mMeasure, "Allocations", rb_cObject);
42
+ }
@@ -1,71 +1,65 @@
1
- /* Copyright (C) 2005-2013 Shugo Maeda <shugo@ruby-lang.org> and Charlie Savage <cfis@savagexi.com>
2
- Please see the LICENSE file for copyright and distribution information */
3
-
4
- #include "ruby_prof.h"
5
- #include <time.h>
6
-
7
- static VALUE cMeasureProcessTime;
8
-
9
- static double
10
- measure_process_time()
11
- {
12
- #if defined(__linux__)
13
- struct timespec clock;
14
- clock_gettime(CLOCK_PROCESS_CPUTIME_ID , &clock);
15
- return clock.tv_sec + (clock.tv_nsec/1000000000.0);
16
- #elif defined(_win32)
17
- FILETIME createTime;
18
- FILETIME exitTime;
19
- FILETIME sysTime;
20
- FILETIME cpuTime;
21
-
22
- ULARGE_INTEGER sysTimeInt;
23
- ULARGE_INTEGER cpuTimeInt;
24
- ULONGLONG totalTime;
25
-
26
- GetProcessTimes(GetCurrentProcess(), &createTime, &exitTime, &sysTime, &cpuTime);
27
-
28
- /* Doing this based on MSFT's recommendation in the FILETIME structure documentation at
29
- http://msdn.microsoft.com/en-us/library/ms724284%28VS.85%29.aspx*/
30
-
31
- sysTimeInt.LowPart = sysTime.dwLowDateTime;
32
- sysTimeInt.HighPart = sysTime.dwHighDateTime;
33
- cpuTimeInt.LowPart = cpuTime.dwLowDateTime;
34
- cpuTimeInt.HighPart = cpuTime.dwHighDateTime;
35
-
36
- totalTime = sysTimeInt.QuadPart + cpuTimeInt.QuadPart;
37
-
38
- // Times are in 100-nanosecond time units. So instead of 10-9 use 10-7
39
- return totalTime / 10000000.0;
40
- #else
41
- return ((double)clock()) / CLOCKS_PER_SEC;
42
- #endif
43
- }
44
-
45
- /* call-seq:
46
- measure_process_time -> float
47
-
48
- Returns the process time.*/
49
- static VALUE
50
- prof_measure_process_time(VALUE self)
51
- {
52
- return rb_float_new(measure_process_time());
53
- }
54
-
55
- prof_measurer_t* prof_measurer_process_time()
56
- {
57
- prof_measurer_t* measure = ALLOC(prof_measurer_t);
58
- measure->measure = measure_process_time;
59
- return measure;
60
- }
61
-
62
-
63
- void rp_init_measure_process_time()
64
- {
65
- rb_define_const(mProf, "CLOCKS_PER_SEC", INT2NUM(CLOCKS_PER_SEC));
66
- rb_define_const(mProf, "PROCESS_TIME", INT2NUM(MEASURE_PROCESS_TIME));
67
- rb_define_const(mProf, "PROCESS_TIME_ENABLED", Qtrue);
68
-
69
- cMeasureProcessTime = rb_define_class_under(mMeasure, "ProcessTime", rb_cObject);
70
- rb_define_singleton_method(cMeasureProcessTime, "measure", prof_measure_process_time, 0);
71
- }
1
+ /* Copyright (C) 2005-2019 Shugo Maeda <shugo@ruby-lang.org> and Charlie Savage <cfis@savagexi.com>
2
+ Please see the LICENSE file for copyright and distribution information */
3
+
4
+ #include "rp_measurement.h"
5
+ #include <time.h>
6
+
7
+ static VALUE cMeasureProcessTime;
8
+
9
+ static double measure_process_time(rb_trace_arg_t* trace_arg)
10
+ {
11
+ #if defined(_WIN32)
12
+ FILETIME createTime;
13
+ FILETIME exitTime;
14
+ FILETIME sysTime;
15
+ FILETIME userTime;
16
+
17
+ ULARGE_INTEGER sysTimeInt;
18
+ ULARGE_INTEGER userTimeInt;
19
+
20
+ GetProcessTimes(GetCurrentProcess(), &createTime, &exitTime, &sysTime, &userTime);
21
+
22
+ sysTimeInt.LowPart = sysTime.dwLowDateTime;
23
+ sysTimeInt.HighPart = sysTime.dwHighDateTime;
24
+ userTimeInt.LowPart = userTime.dwLowDateTime;
25
+ userTimeInt.HighPart = userTime.dwHighDateTime;
26
+
27
+ return (double)(sysTimeInt.QuadPart + userTimeInt.QuadPart);
28
+ #elif !defined(CLOCK_PROCESS_CPUTIME_ID)
29
+ struct rusage usage;
30
+ getrusage(RUSAGE_SELF, &usage);
31
+ return usage.ru_stime.tv_sec + usage.ru_utime.tv_sec + ((usage.ru_stime.tv_usec + usage.ru_utime.tv_usec) / 1000000.0);
32
+ #else
33
+ struct timespec clock;
34
+ clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &clock);
35
+ return clock.tv_sec + (clock.tv_nsec / 1000000000.0);
36
+ #endif
37
+ }
38
+
39
+ static double multiplier_process_time(void)
40
+ {
41
+ #if defined(_WIN32)
42
+ // Times are in 100-nanosecond time units. So instead of 10-9 use 10-7
43
+ return 1.0 / 10000000.0;
44
+ #else
45
+ return 1.0;
46
+ #endif
47
+ }
48
+
49
+ prof_measurer_t* prof_measurer_process_time(bool track_allocations)
50
+ {
51
+ prof_measurer_t* measure = ALLOC(prof_measurer_t);
52
+ measure->mode = MEASURE_PROCESS_TIME;
53
+ measure->measure = measure_process_time;
54
+ measure->multiplier = multiplier_process_time();
55
+ measure->track_allocations = track_allocations;
56
+ return measure;
57
+ }
58
+
59
+ void rp_init_measure_process_time()
60
+ {
61
+ rb_define_const(mProf, "CLOCKS_PER_SEC", INT2NUM(CLOCKS_PER_SEC));
62
+ rb_define_const(mProf, "PROCESS_TIME", INT2NUM(MEASURE_PROCESS_TIME));
63
+
64
+ cMeasureProcessTime = rb_define_class_under(mMeasure, "ProcessTime", rb_cObject);
65
+ }
@@ -1,42 +1,64 @@
1
- /* Copyright (C) 2005-2013 Shugo Maeda <shugo@ruby-lang.org> and Charlie Savage <cfis@savagexi.com>
2
- Please see the LICENSE file for copyright and distribution information */
3
-
4
- /* :nodoc: */
5
- #include "ruby_prof.h"
6
-
7
- static VALUE cMeasureWallTime;
8
-
9
- static double
10
- measure_wall_time()
11
- {
12
- struct timeval tv;
13
- gettimeofday(&tv, NULL);
14
- return tv.tv_sec + (tv.tv_usec/1000000.0);
15
- }
16
-
17
- prof_measurer_t* prof_measurer_wall_time()
18
- {
19
- prof_measurer_t* measure = ALLOC(prof_measurer_t);
20
- measure->measure = measure_wall_time;
21
- return measure;
22
- }
23
-
24
- /* Document-method: prof_measure_wall_time
25
- call-seq:
26
- measure_wall_time -> float
27
-
28
- Returns the wall time.*/
29
- static VALUE
30
- prof_measure_wall_time(VALUE self)
31
- {
32
- return rb_float_new(measure_wall_time());
33
- }
34
-
35
- void rp_init_measure_wall_time()
36
- {
37
- rb_define_const(mProf, "WALL_TIME", INT2NUM(MEASURE_WALL_TIME));
38
- rb_define_const(mProf, "WALL_TIME_ENABLED", Qtrue);
39
-
40
- cMeasureWallTime = rb_define_class_under(mMeasure, "WallTime", rb_cObject);
41
- rb_define_singleton_method(cMeasureWallTime, "measure", prof_measure_wall_time, 0);
42
- }
1
+ /* Copyright (C) 2005-2019 Shugo Maeda <shugo@ruby-lang.org> and Charlie Savage <cfis@savagexi.com>
2
+ Please see the LICENSE file for copyright and distribution information */
3
+
4
+ /* :nodoc: */
5
+ #include "rp_measurement.h"
6
+
7
+ #if defined(__APPLE__)
8
+ #include <mach/mach_time.h>
9
+ #elif !defined(_WIN32)
10
+ #include <time.h>
11
+ #endif
12
+
13
+ static VALUE cMeasureWallTime;
14
+
15
+ static double measure_wall_time(rb_trace_arg_t* trace_arg)
16
+ {
17
+ #if defined(_WIN32)
18
+ LARGE_INTEGER time;
19
+ QueryPerformanceCounter(&time);
20
+ return (double)time.QuadPart;
21
+ #elif defined(__APPLE__)
22
+ return mach_absolute_time();// * (uint64_t)mach_timebase.numer / (uint64_t)mach_timebase.denom;
23
+ #elif defined(__linux__)
24
+ struct timespec tv;
25
+ clock_gettime(CLOCK_MONOTONIC, &tv);
26
+ return tv.tv_sec + (tv.tv_nsec / 1000000000.0);
27
+ #else
28
+ struct timeval tv;
29
+ gettimeofday(&tv, NULL);
30
+ return tv.tv_sec + (tv.tv_usec / 1000000.0);
31
+ #endif
32
+ }
33
+
34
+ static double multiplier_wall_time(void)
35
+ {
36
+ #if defined(_WIN32)
37
+ LARGE_INTEGER frequency;
38
+ QueryPerformanceFrequency(&frequency);
39
+ return 1.0 / frequency.QuadPart;
40
+ #elif defined(__APPLE__)
41
+ mach_timebase_info_data_t mach_timebase;
42
+ mach_timebase_info(&mach_timebase);
43
+ return (uint64_t)mach_timebase.numer / (uint64_t)mach_timebase.denom / 1000000000.0;
44
+ #else
45
+ return 1.0;
46
+ #endif
47
+ }
48
+
49
+ prof_measurer_t* prof_measurer_wall_time(bool track_allocations)
50
+ {
51
+ prof_measurer_t* measure = ALLOC(prof_measurer_t);
52
+ measure->mode = MEASURE_WALL_TIME;
53
+ measure->measure = measure_wall_time;
54
+ measure->multiplier = multiplier_wall_time();
55
+ measure->track_allocations = track_allocations;
56
+ return measure;
57
+ }
58
+
59
+ void rp_init_measure_wall_time()
60
+ {
61
+ rb_define_const(mProf, "WALL_TIME", INT2NUM(MEASURE_WALL_TIME));
62
+
63
+ cMeasureWallTime = rb_define_class_under(mMeasure, "WallTime", rb_cObject);
64
+ }