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.
- checksums.yaml +5 -5
- data/CHANGES +579 -371
- data/LICENSE +24 -23
- data/README.rdoc +5 -433
- data/Rakefile +98 -110
- data/bin/ruby-prof +328 -329
- data/bin/ruby-prof-check-trace +45 -0
- data/ext/ruby_prof/extconf.rb +16 -59
- data/ext/ruby_prof/rp_aggregate_call_tree.c +59 -0
- data/ext/ruby_prof/rp_aggregate_call_tree.h +13 -0
- data/ext/ruby_prof/rp_allocation.c +287 -0
- data/ext/ruby_prof/rp_allocation.h +31 -0
- data/ext/ruby_prof/rp_call_tree.c +369 -0
- data/ext/ruby_prof/rp_call_tree.h +43 -0
- data/ext/ruby_prof/rp_call_trees.c +288 -0
- data/ext/ruby_prof/rp_call_trees.h +28 -0
- data/ext/ruby_prof/rp_measure_allocations.c +50 -65
- data/ext/ruby_prof/rp_measure_memory.c +42 -73
- data/ext/ruby_prof/rp_measure_process_time.c +65 -71
- data/ext/ruby_prof/rp_measure_wall_time.c +64 -42
- data/ext/ruby_prof/rp_measurement.c +237 -0
- data/ext/ruby_prof/rp_measurement.h +50 -0
- data/ext/ruby_prof/rp_method.c +491 -420
- data/ext/ruby_prof/rp_method.h +62 -57
- data/ext/ruby_prof/rp_profile.c +908 -0
- data/ext/ruby_prof/rp_profile.h +35 -0
- data/ext/ruby_prof/rp_stack.c +212 -128
- data/ext/ruby_prof/rp_stack.h +53 -51
- data/ext/ruby_prof/rp_thread.c +362 -268
- data/ext/ruby_prof/rp_thread.h +39 -27
- data/ext/ruby_prof/ruby_prof.c +52 -695
- data/ext/ruby_prof/ruby_prof.h +26 -55
- data/ext/ruby_prof/vc/ruby_prof.sln +28 -21
- data/ext/ruby_prof/vc/{ruby_prof_20.vcxproj → ruby_prof.vcxproj} +56 -8
- data/lib/ruby-prof.rb +52 -67
- data/lib/ruby-prof/assets/call_stack_printer.html.erb +710 -0
- data/lib/ruby-prof/assets/call_stack_printer.png +0 -0
- data/lib/ruby-prof/assets/graph_printer.html.erb +355 -0
- data/lib/ruby-prof/call_tree.rb +57 -0
- data/lib/ruby-prof/call_tree_visitor.rb +36 -0
- data/lib/ruby-prof/compatibility.rb +99 -169
- data/lib/ruby-prof/exclude_common_methods.rb +198 -0
- data/lib/ruby-prof/measurement.rb +17 -0
- data/lib/ruby-prof/method_info.rb +78 -131
- data/lib/ruby-prof/printers/abstract_printer.rb +137 -85
- data/lib/ruby-prof/printers/call_info_printer.rb +53 -41
- data/lib/ruby-prof/printers/call_stack_printer.rb +180 -773
- data/lib/ruby-prof/printers/call_tree_printer.rb +151 -92
- data/lib/ruby-prof/printers/dot_printer.rb +132 -132
- data/lib/ruby-prof/printers/flat_printer.rb +53 -69
- data/lib/ruby-prof/printers/graph_html_printer.rb +63 -255
- data/lib/ruby-prof/printers/graph_printer.rb +113 -116
- data/lib/ruby-prof/printers/multi_printer.rb +127 -56
- data/lib/ruby-prof/profile.rb +37 -77
- data/lib/ruby-prof/rack.rb +62 -15
- data/lib/ruby-prof/task.rb +147 -147
- data/lib/ruby-prof/thread.rb +10 -12
- data/lib/ruby-prof/version.rb +3 -0
- data/lib/unprof.rb +10 -10
- data/ruby-prof.gemspec +65 -61
- data/test/abstract_printer_test.rb +26 -0
- data/test/alias_test.rb +126 -0
- data/test/basic_test.rb +43 -128
- data/test/call_tree_visitor_test.rb +32 -0
- data/test/call_trees_test.rb +66 -0
- data/test/duplicate_names_test.rb +32 -32
- data/test/dynamic_method_test.rb +53 -74
- data/test/enumerable_test.rb +21 -16
- data/test/exceptions_test.rb +24 -16
- data/test/exclude_methods_test.rb +151 -0
- data/test/exclude_threads_test.rb +53 -54
- data/test/fiber_test.rb +129 -65
- data/test/gc_test.rb +90 -0
- data/test/inverse_call_tree_test.rb +175 -0
- data/test/line_number_test.rb +158 -71
- data/test/marshal_test.rb +113 -0
- data/test/measure_allocations.rb +30 -0
- data/test/measure_allocations_test.rb +375 -25
- data/test/measure_allocations_trace_test.rb +375 -0
- data/test/measure_memory_trace_test.rb +1101 -0
- data/test/measure_process_time_test.rb +785 -62
- data/test/measure_times.rb +56 -0
- data/test/measure_wall_time_test.rb +434 -254
- data/test/multi_printer_test.rb +71 -82
- data/test/no_method_class_test.rb +15 -15
- data/test/pause_resume_test.rb +175 -166
- data/test/prime.rb +54 -54
- data/test/prime_script.rb +6 -0
- data/test/printer_call_stack_test.rb +27 -0
- data/test/printer_call_tree_test.rb +30 -0
- data/test/printer_flat_test.rb +99 -0
- data/test/printer_graph_html_test.rb +59 -0
- data/test/printer_graph_test.rb +40 -0
- data/test/printers_test.rb +141 -257
- data/test/printing_recursive_graph_test.rb +81 -0
- data/test/profile_test.rb +16 -0
- data/test/rack_test.rb +93 -0
- data/test/recursive_test.rb +206 -215
- data/test/singleton_test.rb +38 -38
- data/test/stack_printer_test.rb +64 -78
- data/test/start_stop_test.rb +109 -112
- data/test/test_helper.rb +13 -115
- data/test/thread_test.rb +144 -178
- data/test/unique_call_path_test.rb +120 -224
- data/test/yarv_test.rb +56 -0
- metadata +77 -133
- data/doc/LICENSE.html +0 -155
- data/doc/README_rdoc.html +0 -648
- data/doc/Rack.html +0 -167
- data/doc/Rack/RubyProf.html +0 -319
- data/doc/RubyProf.html +0 -1000
- data/doc/RubyProf/AbstractPrinter.html +0 -580
- data/doc/RubyProf/AggregateCallInfo.html +0 -570
- data/doc/RubyProf/CallInfo.html +0 -512
- data/doc/RubyProf/CallInfoPrinter.html +0 -190
- data/doc/RubyProf/CallInfoVisitor.html +0 -332
- data/doc/RubyProf/CallStackPrinter.html +0 -1600
- data/doc/RubyProf/CallTreePrinter.html +0 -413
- data/doc/RubyProf/Cmd.html +0 -669
- data/doc/RubyProf/DotPrinter.html +0 -312
- data/doc/RubyProf/FlatPrinter.html +0 -229
- data/doc/RubyProf/FlatPrinterWithLineNumbers.html +0 -267
- data/doc/RubyProf/GraphHtmlPrinter.html +0 -630
- data/doc/RubyProf/GraphPrinter.html +0 -209
- data/doc/RubyProf/MethodInfo.html +0 -713
- data/doc/RubyProf/MultiPrinter.html +0 -407
- data/doc/RubyProf/Profile.html +0 -821
- data/doc/RubyProf/ProfileTask.html +0 -532
- data/doc/RubyProf/Test.html +0 -578
- data/doc/RubyProf/Thread.html +0 -262
- data/doc/created.rid +0 -32
- data/doc/examples/flat_txt.html +0 -191
- data/doc/examples/graph_txt.html +0 -305
- data/doc/images/add.png +0 -0
- data/doc/images/brick.png +0 -0
- data/doc/images/brick_link.png +0 -0
- data/doc/images/bug.png +0 -0
- data/doc/images/bullet_black.png +0 -0
- data/doc/images/bullet_toggle_minus.png +0 -0
- data/doc/images/bullet_toggle_plus.png +0 -0
- data/doc/images/date.png +0 -0
- data/doc/images/delete.png +0 -0
- data/doc/images/find.png +0 -0
- data/doc/images/loadingAnimation.gif +0 -0
- data/doc/images/macFFBgHack.png +0 -0
- data/doc/images/package.png +0 -0
- data/doc/images/page_green.png +0 -0
- data/doc/images/page_white_text.png +0 -0
- data/doc/images/page_white_width.png +0 -0
- data/doc/images/plugin.png +0 -0
- data/doc/images/ruby.png +0 -0
- data/doc/images/tag_blue.png +0 -0
- data/doc/images/tag_green.png +0 -0
- data/doc/images/transparent.png +0 -0
- data/doc/images/wrench.png +0 -0
- data/doc/images/wrench_orange.png +0 -0
- data/doc/images/zoom.png +0 -0
- data/doc/index.html +0 -647
- data/doc/js/darkfish.js +0 -155
- data/doc/js/jquery.js +0 -18
- data/doc/js/navigation.js +0 -142
- data/doc/js/search.js +0 -94
- data/doc/js/search_index.js +0 -1
- data/doc/js/searcher.js +0 -228
- data/doc/rdoc.css +0 -543
- data/doc/table_of_contents.html +0 -462
- data/examples/empty.png +0 -0
- data/examples/flat.txt +0 -55
- data/examples/graph.dot +0 -106
- data/examples/graph.html +0 -823
- data/examples/graph.png +0 -0
- data/examples/graph.txt +0 -170
- data/examples/minus.png +0 -0
- data/examples/multi.flat.txt +0 -23
- data/examples/multi.graph.html +0 -906
- data/examples/multi.grind.dat +0 -194
- data/examples/multi.stack.html +0 -573
- data/examples/plus.png +0 -0
- data/examples/stack.html +0 -573
- data/ext/ruby_prof/rp_call_info.c +0 -407
- data/ext/ruby_prof/rp_call_info.h +0 -48
- data/ext/ruby_prof/rp_measure.c +0 -48
- data/ext/ruby_prof/rp_measure.h +0 -45
- data/ext/ruby_prof/rp_measure_cpu_time.c +0 -112
- data/ext/ruby_prof/rp_measure_gc_runs.c +0 -65
- data/ext/ruby_prof/rp_measure_gc_time.c +0 -57
- data/ext/ruby_prof/vc/ruby_prof_18.vcxproj +0 -108
- data/ext/ruby_prof/vc/ruby_prof_19.vcxproj +0 -110
- data/ext/ruby_prof/version.h +0 -7
- data/lib/ruby-prof/aggregate_call_info.rb +0 -72
- data/lib/ruby-prof/call_info.rb +0 -89
- data/lib/ruby-prof/call_info_visitor.rb +0 -44
- data/lib/ruby-prof/images/empty.png +0 -0
- data/lib/ruby-prof/images/minus.png +0 -0
- data/lib/ruby-prof/images/plus.png +0 -0
- data/lib/ruby-prof/printers/flat_printer_with_line_numbers.rb +0 -57
- data/lib/ruby-prof/test.rb +0 -150
- data/test/aggregate_test.rb +0 -136
- data/test/call_info_test.rb +0 -78
- data/test/call_info_visitor_test.rb +0 -31
- data/test/exec_test.rb +0 -14
- data/test/measure_cpu_time_test.rb +0 -220
- data/test/measure_gc_runs_test.rb +0 -32
- data/test/measure_gc_time_test.rb +0 -36
- data/test/measure_memory_test.rb +0 -31
- data/test/method_elimination_test.rb +0 -84
- data/test/module_test.rb +0 -45
- data/test/stack_test.rb +0 -138
- 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 "
|
7
|
-
|
8
|
-
static VALUE cMeasureAllocations;
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
static double
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
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 "
|
7
|
-
|
8
|
-
static VALUE cMeasureMemory;
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
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-
|
2
|
-
Please see the LICENSE file for copyright and distribution information */
|
3
|
-
|
4
|
-
#include "
|
5
|
-
#include <time.h>
|
6
|
-
|
7
|
-
static VALUE cMeasureProcessTime;
|
8
|
-
|
9
|
-
static double
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
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-
|
2
|
-
Please see the LICENSE file for copyright and distribution information */
|
3
|
-
|
4
|
-
/* :nodoc: */
|
5
|
-
#include "
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
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
|
+
}
|