-
Notifications
You must be signed in to change notification settings - Fork 4
/
perf.rake
120 lines (104 loc) · 2.74 KB
/
perf.rake
1
2
3
4
5
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
'.:lib:test:config'.split(':').each { |x| $: << x }
require 'application'
require 'benchmark/ips'
TEST_CNT = (ENV['KO1TEST_CNT'] || 1_000).to_i
TEST_PATH = ENV['KO1TEST_PATH'] || '/'
Ko1TestApp::Application.initialize!
ActiveRecord::Migrator.migrations_paths = ActiveRecord::Tasks::DatabaseTasks.migrations_paths
ActiveRecord::Migration.verbose = true
ActiveRecord::Migrator.migrate(ActiveRecord::Migrator.migrations_paths, nil)
class NullLog
def write str
end
end
$null_logger = NullLog.new
def rackenv path
{
"GATEWAY_INTERFACE" => "CGI/1.1",
"PATH_INFO" => path,
"QUERY_STRING" => "",
"REMOTE_ADDR" => "127.0.0.1",
"REMOTE_HOST" => "localhost",
"REQUEST_METHOD" => "GET",
"REQUEST_URI" => "http://localhost:3000#{path}",
"SCRIPT_NAME" => "",
"SERVER_NAME" => "localhost",
"SERVER_PORT" => "3000",
"SERVER_PROTOCOL" => "HTTP/1.1",
"SERVER_SOFTWARE" => "WEBrick/1.3.1 (Ruby/1.9.3/2011-04-14)",
"HTTP_USER_AGENT" => "curl/7.19.7 (universal-apple-darwin10.0) libcurl/7.19.7 OpenSSL/0.9.8l zlib/1.2.3",
"HTTP_HOST" => "localhost:3000",
"HTTP_ACCEPT" => "*/*",
"rack.version" => [1, 1],
"rack.input" => StringIO.new,
"rack.errors" => $null_logger,
"rack.multithread" => true,
"rack.multiprocess" => false,
"rack.run_once" => false,
"rack.url_scheme" => "http",
"HTTP_VERSION" => "HTTP/1.1",
"REQUEST_PATH" => path
}
end
TESTENV = rackenv TEST_PATH
def do_test_task app
_, _, body = app.call(TESTENV)
body.each { |_| }
body.close
end
task :test do
app = Ko1TestApp::Application.instance
app.app
Benchmark.bm { |x|
x.report("#{TEST_CNT} requests") {
TEST_CNT.times {
do_test_task(app)
}
}
}
end
task :once do
app = Ko1TestApp::Application.instance
app.app
do_test_task app
end
task :gc do
app = Ko1TestApp::Application.instance
app.app
GC::Profiler.enable
TEST_CNT.times { do_test_task(app) }
GC::Profiler.report
GC::Profiler.disable
end
task :allocated_objects_dtrace do
app = Ko1TestApp::Application.instance
app.app
do_test_task(app)
puts "start dtrace #{$$}"
$stdin.gets
TEST_CNT.times { do_test_task(app) }
puts "end"
end
task :allocated_objects do
app = Ko1TestApp::Application.instance
app.app
do_test_task(app)
GC.start
GC.disable
start = ObjectSpace.count_objects
TEST_CNT.times { do_test_task(app) }
finish = ObjectSpace.count_objects
GC.enable
finish.each do |k,v|
p k => (v - start[k]) / TEST_CNT.to_f
end
end
task :test_ips do
app = Ko1TestApp::Application.instance
app.app
Benchmark.ips(10) do |x|
x.report("requsts") {
do_test_task(app)
}
end
end