├── .gitignore ├── Gemfile ├── Gemfile.lock ├── README.md ├── app.rb ├── bench.rb ├── docs ├── index.html ├── jit.svg └── vm.svg ├── driver.yml └── profile.rb /.gitignore: -------------------------------------------------------------------------------- 1 | /*.dump 2 | /perf.data* 3 | /trace_location-*.md 4 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | gem 'sinatra' 4 | gem 'benchmark-driver' 5 | 6 | if RUBY_ENGINE == 'ruby' 7 | gem 'thin' 8 | gem 'stackprof' 9 | 10 | group :development do 11 | gem 'pry' 12 | end 13 | end 14 | -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: https://rubygems.org/ 3 | specs: 4 | benchmark-driver (0.1.0) 5 | benchmark_driver 6 | benchmark_driver (0.15.11) 7 | coderay (1.1.2) 8 | daemons (1.3.1) 9 | eventmachine (1.2.7) 10 | method_source (0.9.2) 11 | mustermann (1.1.1) 12 | ruby2_keywords (~> 0.0.1) 13 | pry (0.12.2) 14 | coderay (~> 1.1.0) 15 | method_source (~> 0.9.0) 16 | rack (2.2.3) 17 | rack-protection (2.0.8.1) 18 | rack 19 | ruby2_keywords (0.0.2) 20 | sinatra (2.0.8.1) 21 | mustermann (~> 1.0) 22 | rack (~> 2.0) 23 | rack-protection (= 2.0.8.1) 24 | tilt (~> 2.0) 25 | stackprof (0.2.15) 26 | thin (1.7.2) 27 | daemons (~> 1.0, >= 1.0.9) 28 | eventmachine (~> 1.0, >= 1.0.4) 29 | rack (>= 1, < 3) 30 | tilt (2.0.10) 31 | 32 | PLATFORMS 33 | ruby 34 | 35 | DEPENDENCIES 36 | benchmark-driver 37 | pry 38 | sinatra 39 | stackprof 40 | thin 41 | 42 | BUNDLED WITH 43 | 2.1.4 44 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Sinatra Benchmark 2 | 3 | Simple Ruby benchmark using Sinatra. 4 | 5 | Inspired by: https://www.rubyguides.com/2018/11/ruby-mjit/ 6 | 7 | ## Run 8 | 9 | ``` 10 | $ bundle exec ruby app.rb 11 | ``` 12 | 13 | ``` 14 | $ ab -c 20 -t 10 http://localhost:4567/ 15 | ``` 16 | 17 | ## In-process benchmark 18 | 19 | ```bash 20 | $ bundle exec ruby -v bench.rb 21 | ruby 2.8.0dev (2020-03-14T09:17:17Z master 666194559f) [x86_64-linux] 22 | benchmark: 20000/20000 23 | 13089.20 rps 24 | 25 | # WARMUP=0 has no meaning for --jit 26 | ``` 27 | 28 | ``` 29 | $ WARMUP=20000 REQUESTS=20000 bundle exec ruby -v bench.rb 30 | ruby 2.8.0dev (2020-03-14T09:17:17Z master 666194559f) [x86_64-linux] 31 | warmup: 20000/20000 32 | benchmark: 20000/20000 33 | 12988.64 rps 34 | 35 | $ WARMUP=20000 REQUESTS=20000 bundle exec ruby -v --jit bench.rb 36 | ruby 2.8.0dev (2020-03-14T09:17:17Z master 666194559f) +JIT [x86_64-linux] 37 | warmup: 20000/20000 38 | benchmark: 20000/20000 39 | 11602.35 rps 40 | ``` 41 | 42 | ## StackProf 43 | ### cpu 44 | 45 | ``` 46 | $ bundle exec ruby -v profile.rb 47 | ruby 2.8.0dev (2020-03-14T09:17:17Z master 666194559f) [x86_64-linux] 48 | $ stackprof stackprof.dump 49 | ================================== 50 | Mode: cpu(1) 51 | Samples: 1850 (0.00% miss rate) 52 | GC: 115 (6.22%) 53 | ================================== 54 | TOTAL (pct) SAMPLES (pct) FRAME 55 | 148 (8.0%) 120 (6.5%) block in 56 | 95 (5.1%) 95 (5.1%) Rack::Utils::HeaderHash#[]= 57 | 172 (9.3%) 94 (5.1%) Sinatra::Helpers#content_type 58 | 93 (5.0%) 93 (5.0%) (sweeping) 59 | 89 (4.8%) 89 (4.8%) Rack::Request::Env#get_header 60 | 71 (3.8%) 71 (3.8%) Rack::Utils::HeaderHash#[] 61 | 104 (5.6%) 69 (3.7%) Rack::Protection::Base#html? 62 | 61 (3.3%) 61 (3.3%) Rack::Protection::PathTraversal#cleanup 63 | 45 (2.4%) 45 (2.4%) MonitorMixin#mon_initialize 64 | 212 (11.5%) 40 (2.2%) Sinatra::Base#process_route 65 | 215 (11.6%) 39 (2.1%) block in 66 | 51 (2.8%) 39 (2.1%) Sinatra::Base#filter! 67 | 762 (41.2%) 35 (1.9%) Sinatra::Base#invoke 68 | 42 (2.3%) 35 (1.9%) Sinatra::Base#settings 69 | 49 (2.6%) 35 (1.9%) Rack::Utils::HeaderHash#each 70 | 35 (1.9%) 35 (1.9%) Sinatra::IndifferentHash#initialize 71 | 33 (1.8%) 33 (1.8%) block in set 72 | 30 (1.6%) 30 (1.6%) Mustermann::RegexpBased#match 73 | 36 (1.9%) 29 (1.6%) Sinatra::Base.compile! 74 | 176 (9.5%) 28 (1.5%) block in 75 | 27 (1.5%) 27 (1.5%) Rack::Request::Env#initialize 76 | 67 (3.6%) 26 (1.4%) Sinatra::Response#finish 77 | 39 (2.1%) 26 (1.4%) Sinatra::Base#error_block! 78 | 25 (1.4%) 25 (1.4%) Rack::Protection::Base#safe? 79 | 47 (2.5%) 24 (1.3%) Sinatra::Base.mime_type 80 | 1735 (93.8%) 23 (1.2%) block in
81 | 54 (2.9%) 23 (1.2%) Sinatra::Helpers#body 82 | 23 (1.2%) 23 (1.2%) #.mime_type 83 | 22 (1.2%) 22 (1.2%) (marking) 84 | 33 (1.8%) 21 (1.1%) Rack::Response#initialize 85 | 86 | $ bundle exec ruby -v --jit profile.rb 87 | ruby 2.8.0dev (2020-03-14T09:17:17Z master 666194559f) +JIT [x86_64-linux] 88 | $ stackprof stackprof.dump 89 | ================================== 90 | Mode: cpu(1) 91 | Samples: 2260 (0.00% miss rate) 92 | GC: 146 (6.46%) 93 | ================================== 94 | TOTAL (pct) SAMPLES (pct) FRAME 95 | 169 (7.5%) 139 (6.2%) block in 96 | 131 (5.8%) 131 (5.8%) Rack::Utils::HeaderHash#[]= 97 | 121 (5.4%) 121 (5.4%) (sweeping) 98 | 114 (5.0%) 114 (5.0%) Rack::Request::Env#get_header 99 | 208 (9.2%) 112 (5.0%) Sinatra::Helpers#content_type 100 | 281 (12.4%) 82 (3.6%) block in 101 | 81 (3.6%) 81 (3.6%) Rack::Protection::PathTraversal#cleanup 102 | 79 (3.5%) 79 (3.5%) Rack::Utils::HeaderHash#[] 103 | 121 (5.4%) 78 (3.5%) Rack::Protection::Base#html? 104 | 56 (2.5%) 56 (2.5%) Sinatra::Base#settings 105 | 66 (2.9%) 54 (2.4%) Sinatra::Base#filter! 106 | 52 (2.3%) 52 (2.3%) MonitorMixin#mon_initialize 107 | 50 (2.2%) 50 (2.2%) Rack::Request::Env#initialize 108 | 907 (40.1%) 49 (2.2%) Sinatra::Base#invoke 109 | 46 (2.0%) 46 (2.0%) Mustermann::RegexpBased#match 110 | 45 (2.0%) 45 (2.0%) Sinatra::IndifferentHash#initialize 111 | 44 (1.9%) 44 (1.9%) block in set 112 | 62 (2.7%) 43 (1.9%) Rack::Utils::HeaderHash#each 113 | 2114 (93.5%) 36 (1.6%) block in
114 | 43 (1.9%) 35 (1.5%) Sinatra::Base.compile! 115 | 52 (2.3%) 33 (1.5%) Rack::Response#initialize 116 | 32 (1.4%) 32 (1.4%) Rack::Protection::Base#safe? 117 | 31 (1.4%) 31 (1.4%) #.mime_type 118 | 69 (3.1%) 31 (1.4%) Sinatra::Response#finish 119 | 199 (8.8%) 30 (1.3%) block in 120 | 60 (2.7%) 29 (1.3%) Sinatra::Base.mime_type 121 | 44 (1.9%) 26 (1.2%) Rack::Protection::JsonCsrf#has_vector? 122 | 253 (11.2%) 26 (1.2%) Sinatra::Base#process_route 123 | 25 (1.1%) 25 (1.1%) (marking) 124 | 43 (1.9%) 24 (1.1%) Sinatra::Base#error_block! 125 | ``` 126 | 127 | ### wall 128 | ``` 129 | $ MODE=wall INTERVAL=10 bundle exec ruby -v profile.rb 130 | ruby 2.8.0dev (2020-03-14T09:17:17Z master 666194559f) [x86_64-linux] 131 | $ stackprof stackprof.dump 132 | ================================== 133 | Mode: wall(10) 134 | Samples: 1236566 (0.04% miss rate) 135 | GC: 71882 (5.81%) 136 | ================================== 137 | TOTAL (pct) SAMPLES (pct) FRAME 138 | 107959 (8.7%) 81778 (6.6%) block in 139 | 74406 (6.0%) 74406 (6.0%) Rack::Utils::HeaderHash#[]= 140 | 66856 (5.4%) 66856 (5.4%) Rack::Request::Env#get_header 141 | 61631 (5.0%) 61631 (5.0%) (sweeping) 142 | 121048 (9.8%) 58112 (4.7%) Sinatra::Helpers#content_type 143 | 47943 (3.9%) 47943 (3.9%) Rack::Utils::HeaderHash#[] 144 | 45388 (3.7%) 45388 (3.7%) Rack::Protection::PathTraversal#cleanup 145 | 165691 (13.4%) 36163 (2.9%) block in 146 | 33204 (2.7%) 33204 (2.7%) block in set 147 | 54588 (4.4%) 32346 (2.6%) Rack::Protection::Base#html? 148 | 37261 (3.0%) 29737 (2.4%) Sinatra::Base#filter! 149 | 32472 (2.6%) 28807 (2.3%) Sinatra::Base#settings 150 | 26972 (2.2%) 26972 (2.2%) MonitorMixin#mon_initialize 151 | 146950 (11.9%) 25160 (2.0%) Sinatra::Base#process_route 152 | 24888 (2.0%) 24888 (2.0%) Mustermann::RegexpBased#match 153 | 22501 (1.8%) 22501 (1.8%) Rack::Request::Env#initialize 154 | 29028 (2.3%) 22242 (1.8%) Rack::Utils::HeaderHash#each 155 | 525011 (42.5%) 21835 (1.8%) Sinatra::Base#invoke 156 | 129528 (10.5%) 21569 (1.7%) block in 157 | 33767 (2.7%) 21368 (1.7%) Rack::Response#initialize 158 | 34591 (2.8%) 20910 (1.7%) Sinatra::Base.mime_type 159 | 18836 (1.5%) 18836 (1.5%) Sinatra::IndifferentHash#initialize 160 | 1164684 (94.2%) 17125 (1.4%) block in
161 | 49443 (4.0%) 16739 (1.4%) Sinatra::Response#finish 162 | 20203 (1.6%) 16428 (1.3%) Sinatra::Base.compile! 163 | 26485 (2.1%) 15343 (1.2%) Rack::Protection::JsonCsrf#has_vector? 164 | 14591 (1.2%) 14591 (1.2%) Rack::BodyProxy#initialize 165 | 13681 (1.1%) 13681 (1.1%) #.mime_type 166 | 19742 (1.6%) 11714 (0.9%) Sinatra::Base#error_block! 167 | 20041 (1.6%) 11655 (0.9%) Rack::Utils::HeaderHash.[] 168 | 169 | $ MODE=wall INTERVAL=10 bundle exec ruby -v --jit profile.rb 170 | ruby 2.8.0dev (2020-03-14T09:17:17Z master 666194559f) +JIT [x86_64-linux] 171 | $ stackprof stackprof.dump 172 | ================================== 173 | Mode: wall(10) 174 | Samples: 1522274 (0.11% miss rate) 175 | GC: 75341 (4.95%) 176 | ================================== 177 | TOTAL (pct) SAMPLES (pct) FRAME 178 | 92639 (6.1%) 92639 (6.1%) Rack::Request::Env#get_header 179 | 117903 (7.7%) 89299 (5.9%) block in 180 | 85101 (5.6%) 85101 (5.6%) Rack::Utils::HeaderHash#[]= 181 | 138437 (9.1%) 83158 (5.5%) Sinatra::Helpers#content_type 182 | 64404 (4.2%) 64404 (4.2%) (sweeping) 183 | 64283 (4.2%) 64283 (4.2%) Rack::Utils::HeaderHash#[] 184 | 78886 (5.2%) 45858 (3.0%) Rack::Protection::Base#html? 185 | 40846 (2.7%) 40846 (2.7%) Rack::Request::Env#initialize 186 | 40572 (2.7%) 40572 (2.7%) Rack::Protection::PathTraversal#cleanup 187 | 45974 (3.0%) 39728 (2.6%) Sinatra::Base#filter! 188 | 39643 (2.6%) 39643 (2.6%) block in set 189 | 36380 (2.4%) 36380 (2.4%) Sinatra::Base#settings 190 | 178555 (11.7%) 36114 (2.4%) block in 191 | 195408 (12.8%) 33304 (2.2%) Sinatra::Base#process_route 192 | 43715 (2.9%) 33028 (2.2%) Rack::Utils::HeaderHash#each 193 | 32391 (2.1%) 32391 (2.1%) Sinatra::IndifferentHash#initialize 194 | 654296 (43.0%) 25936 (1.7%) Sinatra::Base#invoke 195 | 25862 (1.7%) 25862 (1.7%) Mustermann::RegexpBased#match 196 | 142441 (9.4%) 24538 (1.6%) block in 197 | 23592 (1.5%) 23592 (1.5%) MonitorMixin#mon_initialize 198 | 36047 (2.4%) 22500 (1.5%) Rack::Response#initialize 199 | 32840 (2.2%) 22443 (1.5%) Sinatra::Base.force_encoding 200 | 28994 (1.9%) 20618 (1.4%) Sinatra::Base#error_block! 201 | 1446933 (95.1%) 20603 (1.4%) block in
202 | 25699 (1.7%) 20097 (1.3%) Sinatra::Base.compile! 203 | 19882 (1.3%) 19882 (1.3%) Rack::Protection::Base#safe? 204 | 32869 (2.2%) 19512 (1.3%) Sinatra::Base.mime_type 205 | 32243 (2.1%) 18842 (1.2%) Rack::Protection::JsonCsrf#has_vector? 206 | 18094 (1.2%) 18094 (1.2%) Logger#level= 207 | 17473 (1.1%) 17473 (1.1%) Sinatra::IndifferentHash#merge! 208 | ``` 209 | 210 | ## Perf 211 | ### report 212 | 213 | ``` 214 | $ PERF="record -c 10000" WARMUP=20000 REQUESTS=20000 sudo -E ~/.rbenv/versions/ruby/bin/ruby -v bench.rb 215 | ruby 2.8.0dev (2020-03-14T09:17:17Z master 666194559f) [x86_64-linux] 216 | warmup: 20000/20000 217 | benchmark: 20000/20000 218 | [ perf record: Woken up 10 times to write data ] 219 | [ perf record: Captured and wrote 2.442 MB perf.data (78226 samples) ] 220 | 11761.22 rps 221 | 222 | $ sudo perf report 223 | Samples: 78K of event 'cycles:ppp', Event count (approx.): 782260000 224 | Overhead Command Shared Object Symbol 225 | 20.17% ruby ruby [.] vm_exec_core 226 | 4.70% ruby ruby [.] vm_call_cfunc 227 | 2.81% ruby ruby [.] rb_id_table_lookup 228 | 2.38% ruby ruby [.] gc_sweep_step 229 | 1.88% ruby ruby [.] rb_memhash 230 | 1.78% ruby ruby [.] rb_st_lookup 231 | 1.63% ruby ruby [.] CALLER_SETUP_ARG 232 | 1.57% ruby ruby [.] rb_class_of 233 | 1.49% ruby ruby [.] vm_call_iseq_setup_normal_0start_0params_0locals 234 | 1.39% ruby ruby [.] rb_vm_search_method_slowpath 235 | 1.18% ruby ruby [.] vm_call_iseq_setup_normal_0start_1params_1locals 236 | 1.13% ruby libc-2.27.so [.] _int_malloc 237 | 1.12% ruby ruby [.] callable_method_entry.constprop.440 238 | 1.03% ruby ruby [.] rb_wb_protected_newobj_of 239 | 0.99% ruby ruby [.] rb_vm_exec 240 | 0.99% ruby ruby [.] vm_call_iseq_setup 241 | 0.97% ruby libc-2.27.so [.] cfree@GLIBC_2.2.5 242 | 0.92% ruby ruby [.] rb_enc_get 243 | 0.84% ruby ruby [.] rb_enc_mbclen 244 | 0.78% ruby libc-2.27.so [.] malloc 245 | 0.74% ruby ruby [.] rb_vm_call0 246 | 0.74% ruby ruby [.] match_at 247 | 0.68% ruby ruby [.] vm_call_ivar 248 | 0.61% ruby ruby [.] rb_file_expand_path_internal 249 | 0.61% ruby ruby [.] vm_call_iseq_setup_normal_opt_start 250 | 0.56% ruby ruby [.] rb_obj_is_kind_of 251 | 0.55% ruby libc-2.27.so [.] __malloc_usable_size 252 | 0.54% ruby ruby [.] vm_setivar 253 | 0.53% ruby ruby [.] rb_enc_set_index 254 | 0.52% ruby ruby [.] vm_search_super_method 255 | 0.51% ruby ruby [.] vm_call_iseq_setup_normal_0start_1params_2locals 256 | 0.49% ruby ruby [.] method_entry_resolve_refinement 257 | 258 | 259 | $ PERF="record -c 10000" WARMUP=20000 REQUESTS=20000 sudo -E ~/.rbenv/versions/ruby/bin/ruby -v --jit-debug=-g1 --jit-save-temps bench.rb 260 | ruby 2.8.0dev (2020-03-14T09:17:17Z master 666194559f) +JIT [x86_64-linux] 261 | warmup: 20000/20000 262 | benchmark: 20000/20000 263 | [ perf record: Woken up 13 times to write data ] 264 | [ perf record: Captured and wrote 3.082 MB perf.data (98476 samples) ] 265 | 10052.47 rps 266 | 267 | $ sudo perf report 268 | Samples: 98K of event 'cycles:ppp', Event count (approx.): 984760000 269 | Overhead Command Shared Object Symbol 270 | 7.82% ruby ruby [.] vm_exec_core 271 | 4.57% ruby ruby [.] vm_call_cfunc 272 | 3.10% ruby ruby [.] rb_id_table_lookup 273 | 2.22% ruby ruby [.] gc_sweep_step 274 | 1.70% ruby ruby [.] rb_st_lookup 275 | 1.66% ruby ruby [.] rb_memhash 276 | 1.55% ruby ruby [.] rb_vm_exec 277 | 1.45% ruby ruby [.] CALLER_SETUP_ARG 278 | 1.30% ruby ruby [.] rb_vm_search_method_slowpath 279 | 1.05% ruby ruby [.] callable_method_entry.constprop.440 280 | 1.02% ruby ruby [.] rb_wb_protected_newobj_of 281 | 1.00% ruby libc-2.27.so [.] _int_malloc 282 | 0.92% ruby libc-2.27.so [.] cfree@GLIBC_2.2.5 283 | 0.85% ruby ruby [.] rb_enc_get 284 | 0.84% ruby libc-2.27.so [.] malloc 285 | 0.83% ruby ruby [.] vm_call_iseq_setup 286 | 0.72% ruby ruby [.] rb_enc_mbclen 287 | 0.71% ruby ruby [.] vm_call_iseq_setup_normal_0start_0params_0locals 288 | 0.67% ruby ruby [.] rb_vm_call0 289 | 0.66% ruby ruby [.] vm_call_ivar 290 | 0.65% ruby ruby [.] rb_obj_is_kind_of 291 | 0.61% ruby ruby [.] rb_class_of 292 | 0.61% ruby ruby [.] match_at 293 | 0.56% ruby ruby [.] rb_file_expand_path_internal 294 | 0.56% ruby ruby [.] vm_call_iseq_setup_normal_opt_start 295 | 0.54% ruby ruby [.] rb_hash_aref 296 | 0.53% ruby libc-2.27.so [.] __malloc_usable_size 297 | 0.52% ruby ruby [.] vm_yield_setup_args 298 | 0.50% ruby ruby [.] method_entry_resolve_refinement 299 | 0.49% ruby libc-2.27.so [.] malloc_consolidate 300 | 0.49% ruby ruby [.] rb_enc_set_index 301 | 0.46% ruby ruby [.] setup_parameters_complex 302 | ``` 303 | 304 | ### report (call graph) 305 | 306 | ``` 307 | $ PERF="record -c 10000 --call-graph dwarf" WARMUP=20000 REQUESTS=20000 sudo -E ~/.rbenv/versions/ruby/bin/ruby -v bench.rb 308 | ruby 2.8.0dev (2020-03-15T04:13:31Z master 67fbc122fb) [x86_64-linux] 309 | warmup: 20000/20000 310 | benchmark: 20000/20000 311 | [ perf record: Woken up 839 times to write data ] 312 | Warning: 313 | Processed 108625 events and lost 26 chunks! 314 | 315 | Check IO/CPU overload! 316 | 317 | [ perf record: Captured and wrote 653.350 MB perf.data (81251 samples) ] 318 | 11341.86 rps 319 | 320 | $ sudo perf report -i perf.data.old 321 | Samples: 81K of event 'cycles:ppp', Event count (approx.): 812510000 322 | Children Self Command Shared Object Symbol 323 | - 84.81% 20.41% ruby ruby [.] vm_exec_core 324 | - 64.42% vm_exec_core 325 | - 59.29% vm_sendish (inlined) 326 | - 52.71% vm_call_cfunc 327 | - 52.17% vm_call_cfunc_with_frame (inlined) 328 | + 24.38% rb_f_catch 329 | + 7.98% rb_class_s_new 330 | + 3.31% rb_f_print 331 | + 1.98% rb_obj_dup 332 | + 1.91% enum_find 333 | + 1.88% rb_str_aref_m 334 | 1.26% str_gsub 335 | + 1.16% rb_ary_all_p 336 | 1.15% rb_str_downcase 337 | + 0.94% enum_collect 338 | 0.77% rb_str_split_m 339 | + 1.48% vm_search_method_wrap (inlined) 340 | - 1.32% vm_call_method 341 | - 1.28% vm_call_method_each_type 342 | - 1.20% vm_call_cfunc 343 | - 1.14% vm_call_cfunc_with_frame (inlined) 344 | + 0.63% rb_hash_aset 345 | + 0.64% vm_call_iseq_setup_normal_0start_1params_1locals 346 | + 0.57% vm_call_iseq_setup_normal_0start_0params_0locals 347 | + 1.15% vm_opt_aref (inlined) 348 | + 0.56% rb_ary_new_from_values 349 | 0.55% str_duplicate 350 | + 0.52% vm_opt_aset (inlined) 351 | + 19.78% _start 352 | + 84.23% 0.93% ruby ruby [.] rb_vm_exec 353 | + 83.80% 0.00% ruby ruby [.] rb_ec_exec_node 354 | + 83.41% 0.00% ruby ruby [.] _start 355 | 356 | 357 | $ PERF="record -c 10000 --call-graph dwarf" WARMUP=20000 REQUESTS=20000 sudo -E ~/.rbenv/versions/ruby/bin/ruby -v --jit-debug=-g1 --jit-save-temps bench.rb 358 | ruby 2.8.0dev (2020-03-15T04:13:31Z master 67fbc122fb) +JIT [x86_64-linux] 359 | warmup: 20000/20000 360 | benchmark: 20000/20000 361 | [ perf record: Woken up 1014 times to write data ] 362 | Warning: 363 | Processed 126579 events and lost 25 chunks! 364 | 365 | Check IO/CPU overload! 366 | 367 | [ perf record: Captured and wrote 792.909 MB perf.data (98601 samples) ] 368 | 9727.10 rps 369 | 370 | $ sudo perf report 371 | Samples: 98K of event 'cycles:ppp', Event count (approx.): 986010000 372 | Children Self Command Shared Object Symbol 373 | + 81.84% 1.39% ruby ruby [.] rb_vm_exec 374 | - 81.34% 7.59% ruby ruby [.] vm_exec_core 375 | - 73.75% vm_exec_core 376 | - 73.41% vm_sendish (inlined) 377 | - 68.23% mjit_exec (inlined) 378 | - 58.95% _mjit33_sinatra_base_rb_call 379 | - 58.81% _mjit34_sinatra_base_rb_synchronize 380 | - 58.57% _mjit37_sinatra_base_rb_block_in_call 381 | - 58.19% _mjit39_sinatra_base_rb_call 382 | - 58.03% _mjit40_sinatra_base_rb_call 383 | - 57.79% rb_vm_exec 384 | - mjit_exec (inlined) 385 | - _mjit41_sinatra_show_exceptions_rb_call 386 | - 57.66% _mjit42_rack_method_override_rb_call 387 | - 57.32% _mjit44_rack_head_rb_call 388 | - 56.99% _mjit45_sinatra_base_rb_call 389 | - 56.82% _mjit49_rack_logger_rb_call 390 | - 52.18% _mjit56_rack_protection_frame_options_rb_call 391 | - 49.51% rb_vm_exec 392 | - vm_exec_core 393 | - 49.30% vm_sendish (inlined) 394 | - 48.44% mjit_exec (inlined) 395 | + 47.60% _mjit60_rack_protection_json_csrf_rb_call 396 | + 0.68% _mjit57_rack_protection_http_origin_rb_accepts_ 397 | + 1.88% _mjit26_rack_protection_base_rb_html_ 398 | + 4.17% vm_call_cfunc 399 | + 9.26% _mjit60_rack_protection_json_csrf_rb_call 400 | - 5.05% vm_call_cfunc 401 | - 5.03% vm_call_cfunc_with_frame (inlined) 402 | + 3.23% rb_f_print 403 | + 1.29% rb_obj_dup 404 | + 6.09% _start 405 | ``` 406 | 407 | ### report (flame graph) 408 | 409 | Set `$PATH` for [brendangregg/FlameGraph](https://github.com/brendangregg/FlameGraph) and: 410 | 411 | ``` 412 | sudo perf script -i perf.data.old | stackcollapse-perf.pl | flamegraph.pl > docs/vm.svg 413 | sudo perf script | stackcollapse-perf.pl | flamegraph.pl > docs/jit.svg 414 | ``` 415 | 416 | See [benchmark-driver.github.io/sinatra](https://benchmark-driver.github.io/sinatra/) 417 | 418 | ### stat 419 | ``` 420 | $ PERF="stat" WARMUP=20000 REQUESTS=20000 sudo -E ~/.rbenv/versions/ruby/bin/ruby -v bench.rb 421 | ruby 2.8.0dev (2020-03-14T09:17:17Z master 666194559f) [x86_64-linux] 422 | warmup: 20000/20000 423 | benchmark: 20000/20000 424 | 425 | Performance counter stats for process id '10211': 426 | 427 | 1599.171103 task-clock (msec) # 1.000 CPUs utilized 428 | 5 context-switches # 0.003 K/sec 429 | 1 cpu-migrations # 0.001 K/sec 430 | 236 page-faults # 0.148 K/sec 431 | 6,703,825,122 cycles # 4.192 GHz 432 | 6,680,974,488 instructions # 1.00 insn per cycle 433 | 1,342,705,221 branches # 839.626 M/sec 434 | 47,979,038 branch-misses # 3.57% of all branches 435 | 436 | 1.599213438 seconds time elapsed 437 | 438 | 12944.64 rps 439 | 440 | $ PERF="stat" WARMUP=20000 REQUESTS=20000 sudo -E ~/.rbenv/versions/ruby/bin/ruby -v --jit bench.rb 441 | ruby 2.8.0dev (2020-03-14T09:17:17Z master 666194559f) +JIT [x86_64-linux] 442 | warmup: 20000/20000 443 | benchmark: 20000/20000 444 | 445 | Performance counter stats for process id '10288': 446 | 447 | 1807.683511 task-clock (msec) # 0.999 CPUs utilized 448 | 107 context-switches # 0.059 K/sec 449 | 0 cpu-migrations # 0.000 K/sec 450 | 233 page-faults # 0.129 K/sec 451 | 7,546,590,686 cycles # 4.175 GHz 452 | 6,617,652,235 instructions # 0.88 insn per cycle 453 | 1,346,985,268 branches # 745.144 M/sec 454 | 42,223,775 branch-misses # 3.13% of all branches 455 | 456 | 1.808596976 seconds time elapsed 457 | 458 | 11487.65 rps 459 | ``` 460 | 461 | ### stat (more) 462 | ``` 463 | $ PERF="stat -e task-clock,cycles,instructions,branches,branch-misses,cache-misses,cache-references,l1d_pend_miss.pending_cycles,l1d_pend_miss.pending_cycles_any,l2_rqsts.all_code_rd,l2_rqsts.code_rd_hit,dsb2mite_switches.penalty_cycles,icache.hit,icache.ifdata_stall,icache.ifetch_stall,icache.misses,idq.all_dsb_cycles_4_uops,idq.all_dsb_cycles_any_uops,idq.all_mite_cycles_4_uops,idq.all_mite_cycles_any_uops,idq.dsb_cycles,idq.dsb_uops,l2_rqsts.code_rd_hit,l2_rqsts.code_rd_miss" WARMUP=20000 REQUESTS=20000 sudo -E ~/.rbenv/versions/ruby/bin/ruby -v bench.rb 464 | ruby 2.8.0dev (2020-03-14T09:17:17Z master 666194559f) [x86_64-linux] 465 | warmup: 20000/20000 466 | benchmark: 20000/20000 467 | 468 | Performance counter stats for process id '11794': 469 | 470 | 1586.574299 task-clock (msec) # 1.000 CPUs utilized 471 | 6,644,885,032 cycles # 4.188 GHz (17.37%) 472 | 6,676,957,970 instructions # 1.00 insn per cycle (21.90%) 473 | 1,338,058,315 branches # 843.363 M/sec (22.16%) 474 | 47,693,924 branch-misses # 3.56% of all branches (22.41%) 475 | 496,650 cache-misses # 0.245 % of all cache refs (22.66%) 476 | 202,497,627 cache-references # 127.632 M/sec (22.63%) 477 | 2,153,663,578 l1d_pend_miss.pending_cycles # 1357.430 M/sec (17.84%) 478 | 2,257,835,321 l1d_pend_miss.pending_cycles_any # 1423.088 M/sec (4.29%) 479 | 258,617,335 l2_rqsts.all_code_rd # 163.004 M/sec (8.57%) 480 | 157,453,746 l2_rqsts.code_rd_hit # 99.241 M/sec (12.86%) 481 | 149,282,346 dsb2mite_switches.penalty_cycles # 94.091 M/sec (17.14%) 482 | 3,287,563,452 icache.hit # 2072.114 M/sec (17.15%) 483 | 906,652,048 icache.ifdata_stall # 571.453 M/sec (17.14%) 484 | 903,912,325 icache.ifetch_stall # 569.726 M/sec (17.14%) 485 | 109,012,625 icache.misses # 68.709 M/sec (17.15%) 486 | 721,386,353 idq.all_dsb_cycles_4_uops # 454.682 M/sec (17.14%) 487 | 1,148,099,107 idq.all_dsb_cycles_any_uops # 723.634 M/sec (17.14%) 488 | 593,925,049 idq.all_mite_cycles_4_uops # 374.344 M/sec (17.14%) 489 | 2,281,133,887 idq.all_mite_cycles_any_uops # 1437.773 M/sec (17.14%) 490 | 1,147,362,230 idq.dsb_cycles # 723.170 M/sec (17.15%) 491 | 3,772,166,577 idq.dsb_uops # 2377.554 M/sec (17.15%) 492 | 157,512,908 l2_rqsts.code_rd_hit # 99.279 M/sec (17.15%) 493 | 100,257,436 l2_rqsts.code_rd_miss # 63.191 M/sec (17.15%) 494 | 495 | 1.586668834 seconds time elapsed 496 | 497 | 13092.99 rps 498 | 499 | $ PERF="stat -e task-clock,cycles,instructions,branches,branch-misses,cache-misses,cache-references,l1d_pend_miss.pending_cycles,l1d_pend_miss.pending_cycles_any,l2_rqsts.all_code_rd,l2_rqsts.code_rd_hit,dsb2mite_switches.penalty_cycles,icache.hit,icache.ifdata_stall,icache.ifetch_stall,icache.misses,idq.all_dsb_cycles_4_uops,idq.all_dsb_cycles_any_uops,idq.all_mite_cycles_4_uops,idq.all_mite_cycles_any_uops,idq.dsb_cycles,idq.dsb_uops,l2_rqsts.code_rd_hit,l2_rqsts.code_rd_miss" WARMUP=20000 REQUESTS=20000 sudo -E ~/.rbenv/versions/ruby/bin/ruby -v --jit bench.rb 500 | ruby 2.8.0dev (2020-03-14T09:17:17Z master 666194559f) +JIT [x86_64-linux] 501 | warmup: 20000/20000 502 | benchmark: 20000/20000 503 | 504 | Performance counter stats for process id '11855': 505 | 506 | 1702.690915 task-clock (msec) # 1.000 CPUs utilized 507 | 7,127,572,665 cycles # 4.186 GHz (17.13%) 508 | 6,440,625,661 instructions # 0.90 insn per cycle (21.60%) 509 | 1,309,829,449 branches # 769.270 M/sec (21.83%) 510 | 40,867,481 branch-misses # 3.12% of all branches (22.06%) 511 | 352,618 cache-misses # 0.118 % of all cache refs (22.30%) 512 | 300,027,391 cache-references # 176.208 M/sec (22.32%) 513 | 2,295,622,687 l1d_pend_miss.pending_cycles # 1348.232 M/sec (17.85%) 514 | 2,334,120,211 l1d_pend_miss.pending_cycles_any # 1370.842 M/sec (4.46%) 515 | 368,693,895 l2_rqsts.all_code_rd # 216.536 M/sec (8.93%) 516 | 174,999,317 l2_rqsts.code_rd_hit # 102.778 M/sec (13.39%) 517 | 109,452,119 dsb2mite_switches.penalty_cycles # 64.282 M/sec (17.85%) 518 | 3,395,994,842 icache.hit # 1994.487 M/sec (17.79%) 519 | 1,423,286,277 icache.ifdata_stall # 835.904 M/sec (17.56%) 520 | 1,423,825,914 icache.ifetch_stall # 836.221 M/sec (17.33%) 521 | 157,340,878 icache.misses # 92.407 M/sec (17.09%) 522 | 445,461,655 idq.all_dsb_cycles_4_uops # 261.622 M/sec (16.91%) 523 | 740,134,139 idq.all_dsb_cycles_any_uops # 434.685 M/sec (16.92%) 524 | 571,685,478 idq.all_mite_cycles_4_uops # 335.754 M/sec (16.92%) 525 | 2,396,189,589 idq.all_mite_cycles_any_uops # 1407.296 M/sec (16.92%) 526 | 734,424,985 idq.dsb_cycles # 431.332 M/sec (16.92%) 527 | 2,383,169,448 idq.dsb_uops # 1399.649 M/sec (16.92%) 528 | 176,746,557 l2_rqsts.code_rd_hit # 103.804 M/sec (16.92%) 529 | 196,245,656 l2_rqsts.code_rd_miss # 115.256 M/sec (16.91%) 530 | 531 | 1.702740743 seconds time elapsed 532 | 533 | 11981.18 rps 534 | ``` 535 | 536 | ## debug\_counter 537 | ### USE\_DEBUG\_COUNTER 538 | ``` 539 | $ WARMUP=20000 REQUESTS=20000 bundle exec ruby -v bench.rb 540 | ruby 2.8.0dev (2020-03-15T09:25:47Z master d79890cbfa) [x86_64-linux] 541 | warmup: 20000/20000 542 | benchmark: 20000/20000 543 | [RUBY_DEBUG_COUNTER] 16938 show_debug_counters 544 | [RUBY_DEBUG_COUNTER] mc_inline_hit 9,100,014 545 | [RUBY_DEBUG_COUNTER] mc_inline_miss_klass 760,016 546 | [RUBY_DEBUG_COUNTER] mc_inline_miss_invalidated 0 547 | [RUBY_DEBUG_COUNTER] mc_cme_complement 0 548 | [RUBY_DEBUG_COUNTER] mc_cme_complement_hit 0 549 | [RUBY_DEBUG_COUNTER] mc_search 660,003 550 | [RUBY_DEBUG_COUNTER] mc_search_notfound 460,000 551 | [RUBY_DEBUG_COUNTER] mc_search_super 3,560,003 552 | [RUBY_DEBUG_COUNTER] ci_packed 1,300,008 553 | [RUBY_DEBUG_COUNTER] ci_kw 0 554 | [RUBY_DEBUG_COUNTER] ci_nokw 0 555 | [RUBY_DEBUG_COUNTER] ci_runtime 1,300,008 556 | [RUBY_DEBUG_COUNTER] cc_new 2 557 | [RUBY_DEBUG_COUNTER] cc_temp 0 558 | [RUBY_DEBUG_COUNTER] cc_found_ccs 760,014 559 | [RUBY_DEBUG_COUNTER] cc_ent_invalidate 0 560 | [RUBY_DEBUG_COUNTER] cc_cme_invalidate 0 561 | [RUBY_DEBUG_COUNTER] cc_invalidate_leaf 0 562 | [RUBY_DEBUG_COUNTER] cc_invalidate_leaf_ccs 0 563 | [RUBY_DEBUG_COUNTER] cc_invalidate_leaf_callable 0 564 | [RUBY_DEBUG_COUNTER] cc_invalidate_tree 0 565 | [RUBY_DEBUG_COUNTER] cc_invalidate_tree_cme 0 566 | [RUBY_DEBUG_COUNTER] cc_invalidate_tree_callable 0 567 | [RUBY_DEBUG_COUNTER] ccs_free 0 568 | [RUBY_DEBUG_COUNTER] ccs_maxlen 1 569 | [RUBY_DEBUG_COUNTER] ccs_found 2,080,012 570 | [RUBY_DEBUG_COUNTER] iseq_num 0 571 | [RUBY_DEBUG_COUNTER] iseq_cd_num 0 572 | [RUBY_DEBUG_COUNTER] ccf_general 2 573 | [RUBY_DEBUG_COUNTER] ccf_iseq_setup 540,003 574 | [RUBY_DEBUG_COUNTER] ccf_iseq_setup_0start 20,000 575 | [RUBY_DEBUG_COUNTER] ccf_iseq_setup_tailcall_0start 0 576 | [RUBY_DEBUG_COUNTER] ccf_iseq_fix 2,500,011 577 | [RUBY_DEBUG_COUNTER] ccf_iseq_opt 200,002 578 | [RUBY_DEBUG_COUNTER] ccf_iseq_kw1 0 579 | [RUBY_DEBUG_COUNTER] ccf_iseq_kw2 0 580 | [RUBY_DEBUG_COUNTER] ccf_cfunc 4,900,012 581 | [RUBY_DEBUG_COUNTER] ccf_ivar 940,001 582 | [RUBY_DEBUG_COUNTER] ccf_attrset 60,000 583 | [RUBY_DEBUG_COUNTER] ccf_method_missing 0 584 | [RUBY_DEBUG_COUNTER] ccf_zsuper 0 585 | [RUBY_DEBUG_COUNTER] ccf_bmethod 380,000 586 | [RUBY_DEBUG_COUNTER] ccf_opt_send 0 587 | [RUBY_DEBUG_COUNTER] ccf_opt_call 20,000 588 | [RUBY_DEBUG_COUNTER] ccf_opt_block_call 0 589 | [RUBY_DEBUG_COUNTER] ccf_super_method 680,001 590 | [RUBY_DEBUG_COUNTER] frame_push 9,520,033 591 | [RUBY_DEBUG_COUNTER] frame_push_method 3,260,016 592 | [RUBY_DEBUG_COUNTER] frame_push_block 860,000 593 | [RUBY_DEBUG_COUNTER] frame_push_class 0 594 | [RUBY_DEBUG_COUNTER] frame_push_top 0 595 | [RUBY_DEBUG_COUNTER] frame_push_cfunc 5,280,014 596 | [RUBY_DEBUG_COUNTER] frame_push_ifunc 100,003 597 | [RUBY_DEBUG_COUNTER] frame_push_eval 0 598 | [RUBY_DEBUG_COUNTER] frame_push_rescue 20,000 599 | [RUBY_DEBUG_COUNTER] frame_push_dummy 0 600 | [RUBY_DEBUG_COUNTER] frame_R2R 3,600,014 601 | [RUBY_DEBUG_COUNTER] frame_R2C 4,962,569 602 | [RUBY_DEBUG_COUNTER] frame_C2C 417,448 603 | [RUBY_DEBUG_COUNTER] frame_C2R 540,002 604 | [RUBY_DEBUG_COUNTER] ivar_get_ic_hit 2,000,006 605 | [RUBY_DEBUG_COUNTER] ivar_get_ic_miss 160,001 606 | [RUBY_DEBUG_COUNTER] ivar_get_ic_miss_serial 60,001 607 | [RUBY_DEBUG_COUNTER] ivar_get_ic_miss_unset 140,001 608 | [RUBY_DEBUG_COUNTER] ivar_get_ic_miss_noobject 0 609 | [RUBY_DEBUG_COUNTER] ivar_set_ic_hit 480,004 610 | [RUBY_DEBUG_COUNTER] ivar_set_ic_miss 260,002 611 | [RUBY_DEBUG_COUNTER] ivar_set_ic_miss_serial 140,002 612 | [RUBY_DEBUG_COUNTER] ivar_set_ic_miss_unset 0 613 | [RUBY_DEBUG_COUNTER] ivar_set_ic_miss_oorange 100,000 614 | [RUBY_DEBUG_COUNTER] ivar_set_ic_miss_noobject 20,000 615 | [RUBY_DEBUG_COUNTER] ivar_get_base 20,000 616 | [RUBY_DEBUG_COUNTER] ivar_set_base 260,002 617 | [RUBY_DEBUG_COUNTER] lvar_get 7,500,026 618 | [RUBY_DEBUG_COUNTER] lvar_get_dynamic 500,000 619 | [RUBY_DEBUG_COUNTER] lvar_set 1,740,011 620 | [RUBY_DEBUG_COUNTER] lvar_set_dynamic 0 621 | [RUBY_DEBUG_COUNTER] lvar_set_slowpath 146 622 | [RUBY_DEBUG_COUNTER] gc_count 145 623 | [RUBY_DEBUG_COUNTER] gc_minor_newobj 145 624 | [RUBY_DEBUG_COUNTER] gc_minor_malloc 0 625 | [RUBY_DEBUG_COUNTER] gc_minor_method 0 626 | [RUBY_DEBUG_COUNTER] gc_minor_capi 0 627 | [RUBY_DEBUG_COUNTER] gc_minor_stress 0 628 | [RUBY_DEBUG_COUNTER] gc_major_nofree 0 629 | [RUBY_DEBUG_COUNTER] gc_major_oldgen 0 630 | [RUBY_DEBUG_COUNTER] gc_major_shady 0 631 | [RUBY_DEBUG_COUNTER] gc_major_force 0 632 | [RUBY_DEBUG_COUNTER] gc_major_oldmalloc 0 633 | [RUBY_DEBUG_COUNTER] gc_isptr_trial 107,223 634 | [RUBY_DEBUG_COUNTER] gc_isptr_range 27,743 635 | [RUBY_DEBUG_COUNTER] gc_isptr_align 12,258 636 | [RUBY_DEBUG_COUNTER] gc_isptr_maybe 8,720 637 | [RUBY_DEBUG_COUNTER] obj_newobj 3,300,009 638 | [RUBY_DEBUG_COUNTER] obj_newobj_slowpath 18,996 639 | [RUBY_DEBUG_COUNTER] obj_newobj_wb_unprotected 180,000 640 | [RUBY_DEBUG_COUNTER] obj_free 3,280,024 641 | [RUBY_DEBUG_COUNTER] obj_promote 1,229 642 | [RUBY_DEBUG_COUNTER] obj_wb_unprotect 0 643 | [RUBY_DEBUG_COUNTER] obj_obj_embed 60,135 644 | [RUBY_DEBUG_COUNTER] obj_obj_transient 59,619 645 | [RUBY_DEBUG_COUNTER] obj_obj_ptr 20,091 646 | [RUBY_DEBUG_COUNTER] obj_str_ptr 200,030 647 | [RUBY_DEBUG_COUNTER] obj_str_embed 1,339,920 648 | [RUBY_DEBUG_COUNTER] obj_str_shared 120,018 649 | [RUBY_DEBUG_COUNTER] obj_str_nofree 0 650 | [RUBY_DEBUG_COUNTER] obj_str_fstr 0 651 | [RUBY_DEBUG_COUNTER] obj_ary_embed 600,235 652 | [RUBY_DEBUG_COUNTER] obj_ary_transient 20,003 653 | [RUBY_DEBUG_COUNTER] obj_ary_ptr 0 654 | [RUBY_DEBUG_COUNTER] obj_ary_extracapa 0 655 | [RUBY_DEBUG_COUNTER] obj_ary_shared_create 0 656 | [RUBY_DEBUG_COUNTER] obj_ary_shared 0 657 | [RUBY_DEBUG_COUNTER] obj_ary_shared_root_occupied 0 658 | [RUBY_DEBUG_COUNTER] obj_hash_empty 140,018 659 | [RUBY_DEBUG_COUNTER] obj_hash_1 20,003 660 | [RUBY_DEBUG_COUNTER] obj_hash_2 0 661 | [RUBY_DEBUG_COUNTER] obj_hash_3 0 662 | [RUBY_DEBUG_COUNTER] obj_hash_4 20,003 663 | [RUBY_DEBUG_COUNTER] obj_hash_5_8 40,008 664 | [RUBY_DEBUG_COUNTER] obj_hash_g8 19,861 665 | [RUBY_DEBUG_COUNTER] obj_hash_null 140,018 666 | [RUBY_DEBUG_COUNTER] obj_hash_ar 80,014 667 | [RUBY_DEBUG_COUNTER] obj_hash_st 19,861 668 | [RUBY_DEBUG_COUNTER] obj_hash_transient 79,613 669 | [RUBY_DEBUG_COUNTER] obj_hash_force_convert 0 670 | [RUBY_DEBUG_COUNTER] obj_struct_embed 0 671 | [RUBY_DEBUG_COUNTER] obj_struct_transient 0 672 | [RUBY_DEBUG_COUNTER] obj_struct_ptr 0 673 | [RUBY_DEBUG_COUNTER] obj_data_empty 0 674 | [RUBY_DEBUG_COUNTER] obj_data_xfree 100,004 675 | [RUBY_DEBUG_COUNTER] obj_data_imm_free 19,850 676 | [RUBY_DEBUG_COUNTER] obj_data_zombie 0 677 | [RUBY_DEBUG_COUNTER] obj_match_under4 80,014 678 | [RUBY_DEBUG_COUNTER] obj_match_ge4 0 679 | [RUBY_DEBUG_COUNTER] obj_match_ge8 0 680 | [RUBY_DEBUG_COUNTER] obj_match_ptr 80,014 681 | [RUBY_DEBUG_COUNTER] obj_iclass_ptr 0 682 | [RUBY_DEBUG_COUNTER] obj_class_ptr 0 683 | [RUBY_DEBUG_COUNTER] obj_module_ptr 0 684 | [RUBY_DEBUG_COUNTER] obj_bignum_ptr 0 685 | [RUBY_DEBUG_COUNTER] obj_bignum_embed 0 686 | [RUBY_DEBUG_COUNTER] obj_float 0 687 | [RUBY_DEBUG_COUNTER] obj_complex 0 688 | [RUBY_DEBUG_COUNTER] obj_rational 0 689 | [RUBY_DEBUG_COUNTER] obj_regexp_ptr 0 690 | [RUBY_DEBUG_COUNTER] obj_file_ptr 0 691 | [RUBY_DEBUG_COUNTER] obj_symbol 0 692 | [RUBY_DEBUG_COUNTER] obj_imemo_ment 20,004 693 | [RUBY_DEBUG_COUNTER] obj_imemo_iseq 0 694 | [RUBY_DEBUG_COUNTER] obj_imemo_env 20,142 695 | [RUBY_DEBUG_COUNTER] obj_imemo_tmpbuf 0 696 | [RUBY_DEBUG_COUNTER] obj_imemo_ast 0 697 | [RUBY_DEBUG_COUNTER] obj_imemo_cref 0 698 | [RUBY_DEBUG_COUNTER] obj_imemo_svar 120,021 699 | [RUBY_DEBUG_COUNTER] obj_imemo_throw_data 60,011 700 | [RUBY_DEBUG_COUNTER] obj_imemo_ifunc 120,020 701 | [RUBY_DEBUG_COUNTER] obj_imemo_memo 60,011 702 | [RUBY_DEBUG_COUNTER] obj_imemo_parser_strterm 0 703 | [RUBY_DEBUG_COUNTER] obj_imemo_callinfo 0 704 | [RUBY_DEBUG_COUNTER] obj_imemo_callcache 0 705 | [RUBY_DEBUG_COUNTER] artable_hint_hit 460,000 706 | [RUBY_DEBUG_COUNTER] artable_hint_miss 0 707 | [RUBY_DEBUG_COUNTER] artable_hint_notfound 660,000 708 | [RUBY_DEBUG_COUNTER] heap_xmalloc 340,801 709 | [RUBY_DEBUG_COUNTER] heap_xrealloc 100,000 710 | [RUBY_DEBUG_COUNTER] heap_xfree 540,128 711 | [RUBY_DEBUG_COUNTER] theap_alloc 160,000 712 | [RUBY_DEBUG_COUNTER] theap_alloc_fail 0 713 | [RUBY_DEBUG_COUNTER] theap_evacuate 784 714 | [RUBY_DEBUG_COUNTER] mjit_exec 0 715 | [RUBY_DEBUG_COUNTER] mjit_exec_not_added 0 716 | [RUBY_DEBUG_COUNTER] mjit_exec_not_ready 0 717 | [RUBY_DEBUG_COUNTER] mjit_exec_not_compiled 0 718 | [RUBY_DEBUG_COUNTER] mjit_exec_call_func 0 719 | [RUBY_DEBUG_COUNTER] mjit_add_iseq_to_process 0 720 | [RUBY_DEBUG_COUNTER] mjit_unload_units 0 721 | [RUBY_DEBUG_COUNTER] mjit_frame_VM2VM 0 722 | [RUBY_DEBUG_COUNTER] mjit_frame_VM2JT 0 723 | [RUBY_DEBUG_COUNTER] mjit_frame_JT2JT 0 724 | [RUBY_DEBUG_COUNTER] mjit_frame_JT2VM 0 725 | [RUBY_DEBUG_COUNTER] mjit_cancel 0 726 | [RUBY_DEBUG_COUNTER] mjit_cancel_ivar_inline 0 727 | [RUBY_DEBUG_COUNTER] mjit_cancel_send_inline 0 728 | [RUBY_DEBUG_COUNTER] mjit_cancel_opt_insn 0 729 | [RUBY_DEBUG_COUNTER] mjit_cancel_invalidate_all 0 730 | [RUBY_DEBUG_COUNTER] mjit_length_unit_queue 0 731 | [RUBY_DEBUG_COUNTER] mjit_length_active_units 0 732 | [RUBY_DEBUG_COUNTER] mjit_length_compact_units 0 733 | [RUBY_DEBUG_COUNTER] mjit_length_stale_units 0 734 | [RUBY_DEBUG_COUNTER] mjit_compile_failures 0 735 | 12141.28 rps 736 | 737 | $ WARMUP=20000 REQUESTS=20000 bundle exec ruby -v --jit bench.rb 738 | ruby 2.8.0dev (2020-03-15T09:25:47Z master d79890cbfa) +JIT [x86_64-linux] 739 | warmup: 20000/20000 740 | benchmark: 20000/20000 741 | [RUBY_DEBUG_COUNTER] 15659 show_debug_counters 742 | [RUBY_DEBUG_COUNTER] mc_inline_hit 7,319,999 743 | [RUBY_DEBUG_COUNTER] mc_inline_miss_klass 760,017 744 | [RUBY_DEBUG_COUNTER] mc_inline_miss_invalidated 0 745 | [RUBY_DEBUG_COUNTER] mc_cme_complement 0 746 | [RUBY_DEBUG_COUNTER] mc_cme_complement_hit 0 747 | [RUBY_DEBUG_COUNTER] mc_search 660,003 748 | [RUBY_DEBUG_COUNTER] mc_search_notfound 460,000 749 | [RUBY_DEBUG_COUNTER] mc_search_super 3,560,003 750 | [RUBY_DEBUG_COUNTER] ci_packed 1,300,010 751 | [RUBY_DEBUG_COUNTER] ci_kw 0 752 | [RUBY_DEBUG_COUNTER] ci_nokw 0 753 | [RUBY_DEBUG_COUNTER] ci_runtime 1,300,010 754 | [RUBY_DEBUG_COUNTER] cc_new 5 755 | [RUBY_DEBUG_COUNTER] cc_temp 0 756 | [RUBY_DEBUG_COUNTER] cc_found_ccs 760,015 757 | [RUBY_DEBUG_COUNTER] cc_ent_invalidate 0 758 | [RUBY_DEBUG_COUNTER] cc_cme_invalidate 0 759 | [RUBY_DEBUG_COUNTER] cc_invalidate_leaf 0 760 | [RUBY_DEBUG_COUNTER] cc_invalidate_leaf_ccs 0 761 | [RUBY_DEBUG_COUNTER] cc_invalidate_leaf_callable 0 762 | [RUBY_DEBUG_COUNTER] cc_invalidate_tree 0 763 | [RUBY_DEBUG_COUNTER] cc_invalidate_tree_cme 0 764 | [RUBY_DEBUG_COUNTER] cc_invalidate_tree_callable 0 765 | [RUBY_DEBUG_COUNTER] ccs_free 0 766 | [RUBY_DEBUG_COUNTER] ccs_maxlen 1 767 | [RUBY_DEBUG_COUNTER] ccs_found 2,080,016 768 | [RUBY_DEBUG_COUNTER] iseq_num 0 769 | [RUBY_DEBUG_COUNTER] iseq_cd_num 0 770 | [RUBY_DEBUG_COUNTER] ccf_general 2 771 | [RUBY_DEBUG_COUNTER] ccf_iseq_setup 540,003 772 | [RUBY_DEBUG_COUNTER] ccf_iseq_setup_0start 0 773 | [RUBY_DEBUG_COUNTER] ccf_iseq_setup_tailcall_0start 0 774 | [RUBY_DEBUG_COUNTER] ccf_iseq_fix 739,998 775 | [RUBY_DEBUG_COUNTER] ccf_iseq_opt 200,002 776 | [RUBY_DEBUG_COUNTER] ccf_iseq_kw1 0 777 | [RUBY_DEBUG_COUNTER] ccf_iseq_kw2 0 778 | [RUBY_DEBUG_COUNTER] ccf_cfunc 5,200,014 779 | [RUBY_DEBUG_COUNTER] ccf_ivar 940,001 780 | [RUBY_DEBUG_COUNTER] ccf_attrset 60,000 781 | [RUBY_DEBUG_COUNTER] ccf_method_missing 0 782 | [RUBY_DEBUG_COUNTER] ccf_zsuper 0 783 | [RUBY_DEBUG_COUNTER] ccf_bmethod 380,000 784 | [RUBY_DEBUG_COUNTER] ccf_opt_send 0 785 | [RUBY_DEBUG_COUNTER] ccf_opt_call 20,000 786 | [RUBY_DEBUG_COUNTER] ccf_opt_block_call 0 787 | [RUBY_DEBUG_COUNTER] ccf_super_method 680,001 788 | [RUBY_DEBUG_COUNTER] frame_push 9,540,037 789 | [RUBY_DEBUG_COUNTER] frame_push_method 2,980,016 790 | [RUBY_DEBUG_COUNTER] frame_push_block 860,000 791 | [RUBY_DEBUG_COUNTER] frame_push_class 0 792 | [RUBY_DEBUG_COUNTER] frame_push_top 0 793 | [RUBY_DEBUG_COUNTER] frame_push_cfunc 5,580,016 794 | [RUBY_DEBUG_COUNTER] frame_push_ifunc 100,005 795 | [RUBY_DEBUG_COUNTER] frame_push_eval 0 796 | [RUBY_DEBUG_COUNTER] frame_push_rescue 20,000 797 | [RUBY_DEBUG_COUNTER] frame_push_dummy 0 798 | [RUBY_DEBUG_COUNTER] frame_R2R 3,320,014 799 | [RUBY_DEBUG_COUNTER] frame_R2C 5,262,640 800 | [RUBY_DEBUG_COUNTER] frame_C2C 417,381 801 | [RUBY_DEBUG_COUNTER] frame_C2R 540,002 802 | [RUBY_DEBUG_COUNTER] ivar_get_ic_hit 1,719,999 803 | [RUBY_DEBUG_COUNTER] ivar_get_ic_miss 160,001 804 | [RUBY_DEBUG_COUNTER] ivar_get_ic_miss_serial 60,001 805 | [RUBY_DEBUG_COUNTER] ivar_get_ic_miss_unset 140,001 806 | [RUBY_DEBUG_COUNTER] ivar_get_ic_miss_noobject 0 807 | [RUBY_DEBUG_COUNTER] ivar_set_ic_hit 320,002 808 | [RUBY_DEBUG_COUNTER] ivar_set_ic_miss 260,002 809 | [RUBY_DEBUG_COUNTER] ivar_set_ic_miss_serial 140,002 810 | [RUBY_DEBUG_COUNTER] ivar_set_ic_miss_unset 0 811 | [RUBY_DEBUG_COUNTER] ivar_set_ic_miss_oorange 100,000 812 | [RUBY_DEBUG_COUNTER] ivar_set_ic_miss_noobject 20,000 813 | [RUBY_DEBUG_COUNTER] ivar_get_base 20,000 814 | [RUBY_DEBUG_COUNTER] ivar_set_base 260,002 815 | [RUBY_DEBUG_COUNTER] lvar_get 7,500,026 816 | [RUBY_DEBUG_COUNTER] lvar_get_dynamic 500,000 817 | [RUBY_DEBUG_COUNTER] lvar_set 1,740,011 818 | [RUBY_DEBUG_COUNTER] lvar_set_dynamic 0 819 | [RUBY_DEBUG_COUNTER] lvar_set_slowpath 146 820 | [RUBY_DEBUG_COUNTER] gc_count 145 821 | [RUBY_DEBUG_COUNTER] gc_minor_newobj 145 822 | [RUBY_DEBUG_COUNTER] gc_minor_malloc 0 823 | [RUBY_DEBUG_COUNTER] gc_minor_method 0 824 | [RUBY_DEBUG_COUNTER] gc_minor_capi 0 825 | [RUBY_DEBUG_COUNTER] gc_minor_stress 0 826 | [RUBY_DEBUG_COUNTER] gc_major_nofree 0 827 | [RUBY_DEBUG_COUNTER] gc_major_oldgen 0 828 | [RUBY_DEBUG_COUNTER] gc_major_shady 0 829 | [RUBY_DEBUG_COUNTER] gc_major_force 0 830 | [RUBY_DEBUG_COUNTER] gc_major_oldmalloc 0 831 | [RUBY_DEBUG_COUNTER] gc_isptr_trial 145,805 832 | [RUBY_DEBUG_COUNTER] gc_isptr_range 44,448 833 | [RUBY_DEBUG_COUNTER] gc_isptr_align 27,878 834 | [RUBY_DEBUG_COUNTER] gc_isptr_maybe 22,486 835 | [RUBY_DEBUG_COUNTER] obj_newobj 3,300,012 836 | [RUBY_DEBUG_COUNTER] obj_newobj_slowpath 18,422 837 | [RUBY_DEBUG_COUNTER] obj_newobj_wb_unprotected 180,000 838 | [RUBY_DEBUG_COUNTER] obj_free 3,280,216 839 | [RUBY_DEBUG_COUNTER] obj_promote 1,274 840 | [RUBY_DEBUG_COUNTER] obj_wb_unprotect 0 841 | [RUBY_DEBUG_COUNTER] obj_obj_embed 60,134 842 | [RUBY_DEBUG_COUNTER] obj_obj_transient 59,347 843 | [RUBY_DEBUG_COUNTER] obj_obj_ptr 20,361 844 | [RUBY_DEBUG_COUNTER] obj_str_ptr 200,049 845 | [RUBY_DEBUG_COUNTER] obj_str_embed 1,339,983 846 | [RUBY_DEBUG_COUNTER] obj_str_shared 120,029 847 | [RUBY_DEBUG_COUNTER] obj_str_nofree 0 848 | [RUBY_DEBUG_COUNTER] obj_str_fstr 0 849 | [RUBY_DEBUG_COUNTER] obj_ary_embed 600,284 850 | [RUBY_DEBUG_COUNTER] obj_ary_transient 19,886 851 | [RUBY_DEBUG_COUNTER] obj_ary_ptr 117 852 | [RUBY_DEBUG_COUNTER] obj_ary_extracapa 0 853 | [RUBY_DEBUG_COUNTER] obj_ary_shared_create 0 854 | [RUBY_DEBUG_COUNTER] obj_ary_shared 0 855 | [RUBY_DEBUG_COUNTER] obj_ary_shared_root_occupied 0 856 | [RUBY_DEBUG_COUNTER] obj_hash_empty 140,026 857 | [RUBY_DEBUG_COUNTER] obj_hash_1 20,005 858 | [RUBY_DEBUG_COUNTER] obj_hash_2 0 859 | [RUBY_DEBUG_COUNTER] obj_hash_3 0 860 | [RUBY_DEBUG_COUNTER] obj_hash_4 20,005 861 | [RUBY_DEBUG_COUNTER] obj_hash_5_8 40,008 862 | [RUBY_DEBUG_COUNTER] obj_hash_g8 19,861 863 | [RUBY_DEBUG_COUNTER] obj_hash_null 140,026 864 | [RUBY_DEBUG_COUNTER] obj_hash_ar 80,018 865 | [RUBY_DEBUG_COUNTER] obj_hash_st 19,861 866 | [RUBY_DEBUG_COUNTER] obj_hash_transient 79,747 867 | [RUBY_DEBUG_COUNTER] obj_hash_force_convert 0 868 | [RUBY_DEBUG_COUNTER] obj_struct_embed 0 869 | [RUBY_DEBUG_COUNTER] obj_struct_transient 0 870 | [RUBY_DEBUG_COUNTER] obj_struct_ptr 0 871 | [RUBY_DEBUG_COUNTER] obj_data_empty 0 872 | [RUBY_DEBUG_COUNTER] obj_data_xfree 100,007 873 | [RUBY_DEBUG_COUNTER] obj_data_imm_free 19,849 874 | [RUBY_DEBUG_COUNTER] obj_data_zombie 0 875 | [RUBY_DEBUG_COUNTER] obj_match_under4 80,020 876 | [RUBY_DEBUG_COUNTER] obj_match_ge4 0 877 | [RUBY_DEBUG_COUNTER] obj_match_ge8 0 878 | [RUBY_DEBUG_COUNTER] obj_match_ptr 80,020 879 | [RUBY_DEBUG_COUNTER] obj_iclass_ptr 0 880 | [RUBY_DEBUG_COUNTER] obj_class_ptr 0 881 | [RUBY_DEBUG_COUNTER] obj_module_ptr 0 882 | [RUBY_DEBUG_COUNTER] obj_bignum_ptr 0 883 | [RUBY_DEBUG_COUNTER] obj_bignum_embed 0 884 | [RUBY_DEBUG_COUNTER] obj_float 0 885 | [RUBY_DEBUG_COUNTER] obj_complex 0 886 | [RUBY_DEBUG_COUNTER] obj_rational 0 887 | [RUBY_DEBUG_COUNTER] obj_regexp_ptr 0 888 | [RUBY_DEBUG_COUNTER] obj_file_ptr 0 889 | [RUBY_DEBUG_COUNTER] obj_symbol 0 890 | [RUBY_DEBUG_COUNTER] obj_imemo_ment 20,005 891 | [RUBY_DEBUG_COUNTER] obj_imemo_iseq 0 892 | [RUBY_DEBUG_COUNTER] obj_imemo_env 20,143 893 | [RUBY_DEBUG_COUNTER] obj_imemo_tmpbuf 0 894 | [RUBY_DEBUG_COUNTER] obj_imemo_ast 0 895 | [RUBY_DEBUG_COUNTER] obj_imemo_cref 0 896 | [RUBY_DEBUG_COUNTER] obj_imemo_svar 120,029 897 | [RUBY_DEBUG_COUNTER] obj_imemo_throw_data 60,015 898 | [RUBY_DEBUG_COUNTER] obj_imemo_ifunc 120,030 899 | [RUBY_DEBUG_COUNTER] obj_imemo_memo 60,015 900 | [RUBY_DEBUG_COUNTER] obj_imemo_parser_strterm 0 901 | [RUBY_DEBUG_COUNTER] obj_imemo_callinfo 0 902 | [RUBY_DEBUG_COUNTER] obj_imemo_callcache 3 903 | [RUBY_DEBUG_COUNTER] artable_hint_hit 460,000 904 | [RUBY_DEBUG_COUNTER] artable_hint_miss 40,000 905 | [RUBY_DEBUG_COUNTER] artable_hint_notfound 660,000 906 | [RUBY_DEBUG_COUNTER] heap_xmalloc 341,075 907 | [RUBY_DEBUG_COUNTER] heap_xrealloc 100,000 908 | [RUBY_DEBUG_COUNTER] heap_xfree 540,413 909 | [RUBY_DEBUG_COUNTER] theap_alloc 160,000 910 | [RUBY_DEBUG_COUNTER] theap_alloc_fail 0 911 | [RUBY_DEBUG_COUNTER] theap_evacuate 1,058 912 | [RUBY_DEBUG_COUNTER] mjit_exec 3,840,016 913 | [RUBY_DEBUG_COUNTER] mjit_exec_not_added 0 914 | [RUBY_DEBUG_COUNTER] mjit_exec_not_ready 580,001 915 | [RUBY_DEBUG_COUNTER] mjit_exec_not_compiled 0 916 | [RUBY_DEBUG_COUNTER] mjit_exec_call_func 3,260,015 917 | [RUBY_DEBUG_COUNTER] mjit_add_iseq_to_process 0 918 | [RUBY_DEBUG_COUNTER] mjit_unload_units 0 919 | [RUBY_DEBUG_COUNTER] mjit_frame_VM2VM 400,001 920 | [RUBY_DEBUG_COUNTER] mjit_frame_VM2JT 1,460,002 921 | [RUBY_DEBUG_COUNTER] mjit_frame_JT2JT 1,800,013 922 | [RUBY_DEBUG_COUNTER] mjit_frame_JT2VM 180,000 923 | [RUBY_DEBUG_COUNTER] mjit_cancel 0 924 | [RUBY_DEBUG_COUNTER] mjit_cancel_ivar_inline 0 925 | [RUBY_DEBUG_COUNTER] mjit_cancel_send_inline 0 926 | [RUBY_DEBUG_COUNTER] mjit_cancel_opt_insn 0 927 | [RUBY_DEBUG_COUNTER] mjit_cancel_invalidate_all 0 928 | [RUBY_DEBUG_COUNTER] mjit_length_unit_queue 30 929 | [RUBY_DEBUG_COUNTER] mjit_length_active_units 100 930 | [RUBY_DEBUG_COUNTER] mjit_length_compact_units 2 931 | [RUBY_DEBUG_COUNTER] mjit_length_stale_units 9 932 | [RUBY_DEBUG_COUNTER] mjit_compile_failures 0 933 | 10841.52 rps 934 | ``` 935 | 936 | ### USE\_INSNS\_COUNTER 937 | ``` 938 | $ WARMUP=20000 REQUESTS=20000 bundle exec ruby -v bench.rb 939 | ruby 2.8.0dev (2020-03-14T09:17:17Z master 666194559f) [x86_64-linux] 940 | warmup: 20000/20000 941 | benchmark: 20000/20000 942 | 12511.24 rps 943 | [RUBY_INSNS_COUNTER] nop 4508940 ( 4.7%) 944 | [RUBY_INSNS_COUNTER] getlocal 41146 ( 0.0%) 945 | [RUBY_INSNS_COUNTER] setlocal 89 ( 0.0%) 946 | [RUBY_INSNS_COUNTER] getblockparam 20213 ( 0.0%) 947 | [RUBY_INSNS_COUNTER] setblockparam 0 ( 0.0%) 948 | [RUBY_INSNS_COUNTER] getblockparamproxy 80927 ( 0.1%) 949 | [RUBY_INSNS_COUNTER] getspecial 1561 ( 0.0%) 950 | [RUBY_INSNS_COUNTER] setspecial 0 ( 0.0%) 951 | [RUBY_INSNS_COUNTER] getinstancevariable 2696267 ( 2.8%) 952 | [RUBY_INSNS_COUNTER] setinstancevariable 1495871 ( 1.6%) 953 | [RUBY_INSNS_COUNTER] getclassvariable 812 ( 0.0%) 954 | [RUBY_INSNS_COUNTER] setclassvariable 55 ( 0.0%) 955 | [RUBY_INSNS_COUNTER] getconstant 6430 ( 0.0%) 956 | [RUBY_INSNS_COUNTER] setconstant 417 ( 0.0%) 957 | [RUBY_INSNS_COUNTER] getglobal 910 ( 0.0%) 958 | [RUBY_INSNS_COUNTER] setglobal 375 ( 0.0%) 959 | [RUBY_INSNS_COUNTER] putnil 1630046 ( 1.7%) 960 | [RUBY_INSNS_COUNTER] putself 8597551 ( 9.0%) 961 | [RUBY_INSNS_COUNTER] putobject 3915628 ( 4.1%) 962 | [RUBY_INSNS_COUNTER] putspecialobject 1426 ( 0.0%) 963 | [RUBY_INSNS_COUNTER] putstring 641617 ( 0.7%) 964 | [RUBY_INSNS_COUNTER] concatstrings 203676 ( 0.2%) 965 | [RUBY_INSNS_COUNTER] tostring 242247 ( 0.3%) 966 | [RUBY_INSNS_COUNTER] freezestring 123077 ( 0.1%) 967 | [RUBY_INSNS_COUNTER] toregexp 395 ( 0.0%) 968 | [RUBY_INSNS_COUNTER] intern 133 ( 0.0%) 969 | [RUBY_INSNS_COUNTER] newarray 423712 ( 0.4%) 970 | [RUBY_INSNS_COUNTER] newarraykwsplat 0 ( 0.0%) 971 | [RUBY_INSNS_COUNTER] duparray 40132 ( 0.0%) 972 | [RUBY_INSNS_COUNTER] duphash 18 ( 0.0%) 973 | [RUBY_INSNS_COUNTER] expandarray 180160 ( 0.2%) 974 | [RUBY_INSNS_COUNTER] concatarray 12 ( 0.0%) 975 | [RUBY_INSNS_COUNTER] splatarray 280755 ( 0.3%) 976 | [RUBY_INSNS_COUNTER] newhash 220929 ( 0.2%) 977 | [RUBY_INSNS_COUNTER] newrange 579 ( 0.0%) 978 | [RUBY_INSNS_COUNTER] pop 3723527 ( 3.9%) 979 | [RUBY_INSNS_COUNTER] dup 2922647 ( 3.1%) 980 | [RUBY_INSNS_COUNTER] dupn 160853 ( 0.2%) 981 | [RUBY_INSNS_COUNTER] swap 80205 ( 0.1%) 982 | [RUBY_INSNS_COUNTER] reverse 0 ( 0.0%) 983 | [RUBY_INSNS_COUNTER] topn 28 ( 0.0%) 984 | [RUBY_INSNS_COUNTER] setn 283527 ( 0.3%) 985 | [RUBY_INSNS_COUNTER] adjuststack 503 ( 0.0%) 986 | [RUBY_INSNS_COUNTER] defined 255308 ( 0.3%) 987 | [RUBY_INSNS_COUNTER] checkmatch 4525 ( 0.0%) 988 | [RUBY_INSNS_COUNTER] checkkeyword 80071 ( 0.1%) 989 | [RUBY_INSNS_COUNTER] checktype 327210 ( 0.3%) 990 | [RUBY_INSNS_COUNTER] defineclass 792 ( 0.0%) 991 | [RUBY_INSNS_COUNTER] definemethod 3436 ( 0.0%) 992 | [RUBY_INSNS_COUNTER] definesmethod 419 ( 0.0%) 993 | [RUBY_INSNS_COUNTER] send 1329037 ( 1.4%) 994 | [RUBY_INSNS_COUNTER] opt_send_without_block 15534218 (16.2%) 995 | [RUBY_INSNS_COUNTER] opt_str_freeze 2190 ( 0.0%) 996 | [RUBY_INSNS_COUNTER] opt_nil_p 263181 ( 0.3%) 997 | [RUBY_INSNS_COUNTER] opt_str_uminus 0 ( 0.0%) 998 | [RUBY_INSNS_COUNTER] opt_newarray_max 0 ( 0.0%) 999 | [RUBY_INSNS_COUNTER] opt_newarray_min 0 ( 0.0%) 1000 | [RUBY_INSNS_COUNTER] invokesuper 1381854 ( 1.4%) 1001 | [RUBY_INSNS_COUNTER] invokeblock 321705 ( 0.3%) 1002 | [RUBY_INSNS_COUNTER] leave 8152364 ( 8.5%) 1003 | [RUBY_INSNS_COUNTER] throw 40373 ( 0.0%) 1004 | [RUBY_INSNS_COUNTER] jump 363584 ( 0.4%) 1005 | [RUBY_INSNS_COUNTER] branchif 2968812 ( 3.1%) 1006 | [RUBY_INSNS_COUNTER] branchunless 4244963 ( 4.4%) 1007 | [RUBY_INSNS_COUNTER] branchnil 12 ( 0.0%) 1008 | [RUBY_INSNS_COUNTER] opt_getinlinecache 3194489 ( 3.3%) 1009 | [RUBY_INSNS_COUNTER] opt_setinlinecache 4963 ( 0.0%) 1010 | [RUBY_INSNS_COUNTER] once 54 ( 0.0%) 1011 | [RUBY_INSNS_COUNTER] opt_case_dispatch 417 ( 0.0%) 1012 | [RUBY_INSNS_COUNTER] opt_plus 181421 ( 0.2%) 1013 | [RUBY_INSNS_COUNTER] opt_minus 20647 ( 0.0%) 1014 | [RUBY_INSNS_COUNTER] opt_mult 143 ( 0.0%) 1015 | [RUBY_INSNS_COUNTER] opt_div 40003 ( 0.0%) 1016 | [RUBY_INSNS_COUNTER] opt_mod 1324 ( 0.0%) 1017 | [RUBY_INSNS_COUNTER] opt_eq 490384 ( 0.5%) 1018 | [RUBY_INSNS_COUNTER] opt_neq 80327 ( 0.1%) 1019 | [RUBY_INSNS_COUNTER] opt_lt 95 ( 0.0%) 1020 | [RUBY_INSNS_COUNTER] opt_le 41050 ( 0.0%) 1021 | [RUBY_INSNS_COUNTER] opt_gt 1054 ( 0.0%) 1022 | [RUBY_INSNS_COUNTER] opt_ge 113 ( 0.0%) 1023 | [RUBY_INSNS_COUNTER] opt_ltlt 82344 ( 0.1%) 1024 | [RUBY_INSNS_COUNTER] opt_and 281 ( 0.0%) 1025 | [RUBY_INSNS_COUNTER] opt_or 8 ( 0.0%) 1026 | [RUBY_INSNS_COUNTER] opt_aref 2610566 ( 2.7%) 1027 | [RUBY_INSNS_COUNTER] opt_aset 825385 ( 0.9%) 1028 | [RUBY_INSNS_COUNTER] opt_aset_with 80236 ( 0.1%) 1029 | [RUBY_INSNS_COUNTER] opt_aref_with 120001 ( 0.1%) 1030 | [RUBY_INSNS_COUNTER] opt_length 832 ( 0.0%) 1031 | [RUBY_INSNS_COUNTER] opt_size 1707 ( 0.0%) 1032 | [RUBY_INSNS_COUNTER] opt_empty_p 141791 ( 0.1%) 1033 | [RUBY_INSNS_COUNTER] opt_succ 0 ( 0.0%) 1034 | [RUBY_INSNS_COUNTER] opt_not 542540 ( 0.6%) 1035 | [RUBY_INSNS_COUNTER] opt_regexpmatch2 82352 ( 0.1%) 1036 | [RUBY_INSNS_COUNTER] opt_call_c_function 0 ( 0.0%) 1037 | [RUBY_INSNS_COUNTER] invokebuiltin 0 ( 0.0%) 1038 | [RUBY_INSNS_COUNTER] opt_invokebuiltin_delegate 0 ( 0.0%) 1039 | [RUBY_INSNS_COUNTER] opt_invokebuiltin_delegate_leave 1 ( 0.0%) 1040 | [RUBY_INSNS_COUNTER] getlocal_WC_0 14517557 (15.2%) 1041 | [RUBY_INSNS_COUNTER] getlocal_WC_1 972892 ( 1.0%) 1042 | [RUBY_INSNS_COUNTER] setlocal_WC_0 3583101 ( 3.7%) 1043 | [RUBY_INSNS_COUNTER] setlocal_WC_1 52 ( 0.0%) 1044 | [RUBY_INSNS_COUNTER] putobject_INT2FIX_0_ 221806 ( 0.2%) 1045 | [RUBY_INSNS_COUNTER] putobject_INT2FIX_1_ 83370 ( 0.1%) 1046 | 1047 | $ WARMUP=20000 REQUESTS=20000 bundle exec ruby -v --jit bench.rb 1048 | ruby 2.8.0dev (2020-03-14T09:17:17Z master 666194559f) +JIT [x86_64-linux] 1049 | warmup: 20000/20000 1050 | benchmark: 20000/20000 1051 | 10526.11 rps 1052 | [RUBY_INSNS_COUNTER] nop 2376945 ( 3.8%) 1053 | [RUBY_INSNS_COUNTER] getlocal 41146 ( 0.1%) 1054 | [RUBY_INSNS_COUNTER] setlocal 89 ( 0.0%) 1055 | [RUBY_INSNS_COUNTER] getblockparam 20213 ( 0.0%) 1056 | [RUBY_INSNS_COUNTER] setblockparam 0 ( 0.0%) 1057 | [RUBY_INSNS_COUNTER] getblockparamproxy 40927 ( 0.1%) 1058 | [RUBY_INSNS_COUNTER] getspecial 1561 ( 0.0%) 1059 | [RUBY_INSNS_COUNTER] setspecial 0 ( 0.0%) 1060 | [RUBY_INSNS_COUNTER] getinstancevariable 1664190 ( 2.6%) 1061 | [RUBY_INSNS_COUNTER] setinstancevariable 1255861 ( 2.0%) 1062 | [RUBY_INSNS_COUNTER] getclassvariable 812 ( 0.0%) 1063 | [RUBY_INSNS_COUNTER] setclassvariable 55 ( 0.0%) 1064 | [RUBY_INSNS_COUNTER] getconstant 6433 ( 0.0%) 1065 | [RUBY_INSNS_COUNTER] setconstant 417 ( 0.0%) 1066 | [RUBY_INSNS_COUNTER] getglobal 910 ( 0.0%) 1067 | [RUBY_INSNS_COUNTER] setglobal 375 ( 0.0%) 1068 | [RUBY_INSNS_COUNTER] putnil 1110041 ( 1.8%) 1069 | [RUBY_INSNS_COUNTER] putself 5223941 ( 8.3%) 1070 | [RUBY_INSNS_COUNTER] putobject 2935626 ( 4.7%) 1071 | [RUBY_INSNS_COUNTER] putspecialobject 1426 ( 0.0%) 1072 | [RUBY_INSNS_COUNTER] putstring 361617 ( 0.6%) 1073 | [RUBY_INSNS_COUNTER] concatstrings 183676 ( 0.3%) 1074 | [RUBY_INSNS_COUNTER] tostring 222247 ( 0.4%) 1075 | [RUBY_INSNS_COUNTER] freezestring 123077 ( 0.2%) 1076 | [RUBY_INSNS_COUNTER] toregexp 395 ( 0.0%) 1077 | [RUBY_INSNS_COUNTER] intern 133 ( 0.0%) 1078 | [RUBY_INSNS_COUNTER] newarray 263711 ( 0.4%) 1079 | [RUBY_INSNS_COUNTER] newarraykwsplat 0 ( 0.0%) 1080 | [RUBY_INSNS_COUNTER] duparray 40132 ( 0.1%) 1081 | [RUBY_INSNS_COUNTER] duphash 18 ( 0.0%) 1082 | [RUBY_INSNS_COUNTER] expandarray 100159 ( 0.2%) 1083 | [RUBY_INSNS_COUNTER] concatarray 12 ( 0.0%) 1084 | [RUBY_INSNS_COUNTER] splatarray 200755 ( 0.3%) 1085 | [RUBY_INSNS_COUNTER] newhash 160927 ( 0.3%) 1086 | [RUBY_INSNS_COUNTER] newrange 579 ( 0.0%) 1087 | [RUBY_INSNS_COUNTER] pop 2643524 ( 4.2%) 1088 | [RUBY_INSNS_COUNTER] dup 2142645 ( 3.4%) 1089 | [RUBY_INSNS_COUNTER] dupn 80853 ( 0.1%) 1090 | [RUBY_INSNS_COUNTER] swap 40205 ( 0.1%) 1091 | [RUBY_INSNS_COUNTER] reverse 0 ( 0.0%) 1092 | [RUBY_INSNS_COUNTER] topn 28 ( 0.0%) 1093 | [RUBY_INSNS_COUNTER] setn 183525 ( 0.3%) 1094 | [RUBY_INSNS_COUNTER] adjuststack 503 ( 0.0%) 1095 | [RUBY_INSNS_COUNTER] defined 155308 ( 0.2%) 1096 | [RUBY_INSNS_COUNTER] checkmatch 4525 ( 0.0%) 1097 | [RUBY_INSNS_COUNTER] checkkeyword 40071 ( 0.1%) 1098 | [RUBY_INSNS_COUNTER] checktype 307210 ( 0.5%) 1099 | [RUBY_INSNS_COUNTER] defineclass 792 ( 0.0%) 1100 | [RUBY_INSNS_COUNTER] definemethod 3436 ( 0.0%) 1101 | [RUBY_INSNS_COUNTER] definesmethod 419 ( 0.0%) 1102 | [RUBY_INSNS_COUNTER] send 869035 ( 1.4%) 1103 | [RUBY_INSNS_COUNTER] opt_send_without_block 10243248 (16.3%) 1104 | [RUBY_INSNS_COUNTER] opt_str_freeze 2190 ( 0.0%) 1105 | [RUBY_INSNS_COUNTER] opt_nil_p 203180 ( 0.3%) 1106 | [RUBY_INSNS_COUNTER] opt_str_uminus 0 ( 0.0%) 1107 | [RUBY_INSNS_COUNTER] opt_newarray_max 0 ( 0.0%) 1108 | [RUBY_INSNS_COUNTER] opt_newarray_min 0 ( 0.0%) 1109 | [RUBY_INSNS_COUNTER] invokesuper 921851 ( 1.5%) 1110 | [RUBY_INSNS_COUNTER] invokeblock 201705 ( 0.3%) 1111 | [RUBY_INSNS_COUNTER] leave 4240685 ( 6.7%) 1112 | [RUBY_INSNS_COUNTER] throw 40373 ( 0.1%) 1113 | [RUBY_INSNS_COUNTER] jump 303584 ( 0.5%) 1114 | [RUBY_INSNS_COUNTER] branchif 2228808 ( 3.5%) 1115 | [RUBY_INSNS_COUNTER] branchunless 2924968 ( 4.7%) 1116 | [RUBY_INSNS_COUNTER] branchnil 12 ( 0.0%) 1117 | [RUBY_INSNS_COUNTER] opt_getinlinecache 2054479 ( 3.3%) 1118 | [RUBY_INSNS_COUNTER] opt_setinlinecache 4964 ( 0.0%) 1119 | [RUBY_INSNS_COUNTER] once 54 ( 0.0%) 1120 | [RUBY_INSNS_COUNTER] opt_case_dispatch 417 ( 0.0%) 1121 | [RUBY_INSNS_COUNTER] opt_plus 141421 ( 0.2%) 1122 | [RUBY_INSNS_COUNTER] opt_minus 20647 ( 0.0%) 1123 | [RUBY_INSNS_COUNTER] opt_mult 143 ( 0.0%) 1124 | [RUBY_INSNS_COUNTER] opt_div 40003 ( 0.1%) 1125 | [RUBY_INSNS_COUNTER] opt_mod 1324 ( 0.0%) 1126 | [RUBY_INSNS_COUNTER] opt_eq 350388 ( 0.6%) 1127 | [RUBY_INSNS_COUNTER] opt_neq 80329 ( 0.1%) 1128 | [RUBY_INSNS_COUNTER] opt_lt 95 ( 0.0%) 1129 | [RUBY_INSNS_COUNTER] opt_le 41050 ( 0.1%) 1130 | [RUBY_INSNS_COUNTER] opt_gt 1054 ( 0.0%) 1131 | [RUBY_INSNS_COUNTER] opt_ge 113 ( 0.0%) 1132 | [RUBY_INSNS_COUNTER] opt_ltlt 82344 ( 0.1%) 1133 | [RUBY_INSNS_COUNTER] opt_and 281 ( 0.0%) 1134 | [RUBY_INSNS_COUNTER] opt_or 8 ( 0.0%) 1135 | [RUBY_INSNS_COUNTER] opt_aref 1458493 ( 2.3%) 1136 | [RUBY_INSNS_COUNTER] opt_aset 685382 ( 1.1%) 1137 | [RUBY_INSNS_COUNTER] opt_aset_with 40236 ( 0.1%) 1138 | [RUBY_INSNS_COUNTER] opt_aref_with 80001 ( 0.1%) 1139 | [RUBY_INSNS_COUNTER] opt_length 832 ( 0.0%) 1140 | [RUBY_INSNS_COUNTER] opt_size 1707 ( 0.0%) 1141 | [RUBY_INSNS_COUNTER] opt_empty_p 101790 ( 0.2%) 1142 | [RUBY_INSNS_COUNTER] opt_succ 0 ( 0.0%) 1143 | [RUBY_INSNS_COUNTER] opt_not 302539 ( 0.5%) 1144 | [RUBY_INSNS_COUNTER] opt_regexpmatch2 82352 ( 0.1%) 1145 | [RUBY_INSNS_COUNTER] opt_call_c_function 0 ( 0.0%) 1146 | [RUBY_INSNS_COUNTER] invokebuiltin 0 ( 0.0%) 1147 | [RUBY_INSNS_COUNTER] opt_invokebuiltin_delegate 0 ( 0.0%) 1148 | [RUBY_INSNS_COUNTER] opt_invokebuiltin_delegate_leave 1 ( 0.0%) 1149 | [RUBY_INSNS_COUNTER] getlocal_WC_0 9985462 (15.9%) 1150 | [RUBY_INSNS_COUNTER] getlocal_WC_1 446896 ( 0.7%) 1151 | [RUBY_INSNS_COUNTER] setlocal_WC_0 2463089 ( 3.9%) 1152 | [RUBY_INSNS_COUNTER] setlocal_WC_1 52 ( 0.0%) 1153 | [RUBY_INSNS_COUNTER] putobject_INT2FIX_0_ 201805 ( 0.3%) 1154 | [RUBY_INSNS_COUNTER] putobject_INT2FIX_1_ 83370 ( 0.1%) 1155 | ``` 1156 | 1157 | ### MJIT\_COUNTER 1158 | 1159 | ``` 1160 | $ WARMUP=19998 REQUESTS=0 ~/.rbenv/versions/ruby/bin/ruby -v --jit-verbose=1 bench.rb 1161 | ruby 2.8.0dev (2020-04-12T19:19:06Z master 82fdffc5ec) +JIT [x86_64-linux] 1162 | JIT success (44.2ms): get_header@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/request.rb:62 -> /tmp/_ruby_mjit_p25533u0.c 1163 | JIT recompile: get_header@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/request.rb:62 1164 | JIT success (23.2ms): block in set@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:1238 -> /tmp/_ruby_mjit_p25533u1.c 1165 | JIT success (34.3ms): get_header@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/request.rb:62 -> /tmp/_ruby_mjit_p25533u4.c 1166 | JIT recompile: get_header@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/request.rb:62 1167 | JIT success (21.8ms): settings@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:934 -> /tmp/_ruby_mjit_p25533u2.c 1168 | JIT success (44.8ms): get_header@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/request.rb:62 -> /tmp/_ruby_mjit_p25533u7.c 1169 | JIT inline: settings@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:939 => settings@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:934 1170 | JIT success (44.0ms): settings@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:939 -> /tmp/_ruby_mjit_p25533u3.c 1171 | JIT success (1107.5ms): []@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/utils.rb:452 -> /tmp/_ruby_mjit_p25533u5.c 1172 | JIT recompile: []@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/utils.rb:452 1173 | warmup: 19998/19998 1174 | JIT success (1088.4ms): []=@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/utils.rb:456 -> /tmp/_ruby_mjit_p25533u6.c 1175 | JIT success (975.7ms): []@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/utils.rb:452 -> /tmp/_ruby_mjit_p25533u132.c 1176 | JIT success (107.0ms): block in @/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:1822 -> /tmp/_ruby_mjit_p25533u8.c 1177 | JIT success (129.6ms): filter!@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:976 -> /tmp/_ruby_mjit_p25533u9.c 1178 | JIT success (45.5ms): block in content_type@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:346 -> /tmp/_ruby_mjit_p25533u10.c 1179 | JIT success (201.5ms): invoke@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:1071 -> /tmp/_ruby_mjit_p25533u11.c 1180 | JIT success (312.0ms): block in invoke@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:1072 -> /tmp/_ruby_mjit_p25533u12.c 1181 | JIT success (88.0ms): query_string@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/request.rb:158 -> /tmp/_ruby_mjit_p25533u13.c 1182 | JIT success (74.2ms): request_method@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/request.rb:157 -> /tmp/_ruby_mjit_p25533u14.c 1183 | JIT success (182.0ms): body@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:254 -> /tmp/_ruby_mjit_p25533u15.c 1184 | JIT success (253.9ms): level=@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/2.8.0/logger.rb:250 -> /tmp/_ruby_mjit_p25533u16.c 1185 | JIT success (75.3ms): call@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-protection-2.0.8.1/lib/rack/protection/base.rb:45 -> /tmp/_ruby_mjit_p25533u17.c 1186 | JIT success (940.2ms): initialize@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/request.rb:26 -> /tmp/_ruby_mjit_p25533u18.c 1187 | JIT success (921.3ms): initialize@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/request.rb:50 -> /tmp/_ruby_mjit_p25533u19.c 1188 | JIT success (32.4ms): set_header@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/request.rb:78 -> /tmp/_ruby_mjit_p25533u20.c 1189 | JIT success (92.1ms): media_type@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/request.rb:383 -> /tmp/_ruby_mjit_p25533u21.c 1190 | JIT success (59.4ms): content_type@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/request.rb:271 -> /tmp/_ruby_mjit_p25533u22.c 1191 | JIT success (118.3ms): type@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/media_type.rb:16 -> /tmp/_ruby_mjit_p25533u23.c 1192 | JIT success (86.7ms): block in @/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:1828 -> /tmp/_ruby_mjit_p25533u24.c 1193 | JIT success (50.1ms): set_header@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/response.rb:128 -> /tmp/_ruby_mjit_p25533u25.c 1194 | JIT success (78.7ms): drop_body?@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:182 -> /tmp/_ruby_mjit_p25533u26.c 1195 | JIT success (111.5ms): html?@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-protection-2.0.8.1/lib/rack/protection/base.rb:120 -> /tmp/_ruby_mjit_p25533u27.c 1196 | JIT success (947.8ms): each@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/utils.rb:440 -> /tmp/_ruby_mjit_p25533u28.c 1197 | JIT success (322.9ms): block in each@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/utils.rb:441 -> /tmp/_ruby_mjit_p25533u29.c 1198 | JIT success (55.5ms): block in html?@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-protection-2.0.8.1/lib/rack/protection/base.rb:121 -> /tmp/_ruby_mjit_p25533u30.c 1199 | JIT success (76.1ms): []@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/utils.rb:414 -> /tmp/_ruby_mjit_p25533u31.c 1200 | JIT success (19.9ms): environment@(eval):1 -> /tmp/_ruby_mjit_p25533u32.c 1201 | JIT inline: development?@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:1420 => environment@(eval):1 1202 | JIT success (36.8ms): development?@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:1420 -> /tmp/_ruby_mjit_p25533u33.c 1203 | JIT success (81.9ms): call@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:1502 -> /tmp/_ruby_mjit_p25533u34.c 1204 | JIT success (376.3ms): synchronize@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:1726 -> /tmp/_ruby_mjit_p25533u35.c 1205 | JIT inline: lock?@(eval):1 => lock@(eval):1 1206 | JIT success (45.5ms): lock?@(eval):1 -> /tmp/_ruby_mjit_p25533u36.c 1207 | JIT success (19.2ms): lock@(eval):1 -> /tmp/_ruby_mjit_p25533u37.c 1208 | JIT success (44.8ms): block in call@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:1503 -> /tmp/_ruby_mjit_p25533u38.c 1209 | JIT success (73.3ms): prototype@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:1477 -> /tmp/_ruby_mjit_p25533u39.c 1210 | JIT success (42.3ms): call@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:1950 -> /tmp/_ruby_mjit_p25533u40.c 1211 | JIT success (122.3ms): call@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:193 -> /tmp/_ruby_mjit_p25533u41.c 1212 | JIT success (41.5ms): call@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/show_exceptions.rb:21 -> /tmp/_ruby_mjit_p25533u42.c 1213 | JIT success (193.3ms): call@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/method_override.rb:15 -> /tmp/_ruby_mjit_p25533u43.c 1214 | JIT success (52.4ms): allowed_methods@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/method_override.rb:40 -> /tmp/_ruby_mjit_p25533u44.c 1215 | JIT success (217.4ms): call@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/head.rb:11 -> /tmp/_ruby_mjit_p25533u45.c 1216 | JIT success (948.3ms): call@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:223 -> /tmp/_ruby_mjit_p25533u46.c 1217 | JIT success (39.4ms): call@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:229 -> /tmp/_ruby_mjit_p25533u47.c 1218 | JIT success (208.2ms): call@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/common_logger.rb:36 -> /tmp/_ruby_mjit_p25533u48.c 1219 | JIT success (88.8ms): clock_time@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/utils.rb:83 -> /tmp/_ruby_mjit_p25533u49.c 1220 | JIT success (138.5ms): call@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/logger.rb:12 -> /tmp/_ruby_mjit_p25533u50.c 1221 | JIT success (164.4ms): initialize@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/2.8.0/logger.rb:379 -> /tmp/_ruby_mjit_p25533u51.c 1222 | JIT success (33.6ms): initialize@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/2.8.0/logger/formatter.rb:10 -> /tmp/_ruby_mjit_p25533u52.c 1223 | JIT success (41.7ms): datetime_format=@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/2.8.0/logger.rb:279 -> /tmp/_ruby_mjit_p25533u53.c 1224 | JIT success (200.3ms): initialize@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/2.8.0/logger/log_device.rb:14 -> /tmp/_ruby_mjit_p25533u54.c 1225 | JIT success (144.1ms): mon_initialize@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/2.8.0/monitor.rb:230 -> /tmp/_ruby_mjit_p25533u55.c 1226 | JIT success (110.1ms): set_dev@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/2.8.0/logger/log_device.rb:79 -> /tmp/_ruby_mjit_p25533u56.c 1227 | JIT success (105.9ms): call@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-protection-2.0.8.1/lib/rack/protection/frame_options.rb:30 -> /tmp/_ruby_mjit_p25533u57.c 1228 | JIT success (106.7ms): accepts?@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-protection-2.0.8.1/lib/rack/protection/http_origin.rb:30 -> /tmp/_ruby_mjit_p25533u58.c 1229 | JIT success (39.6ms): safe?@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-protection-2.0.8.1/lib/rack/protection/base.rb:37 -> /tmp/_ruby_mjit_p25533u59.c 1230 | JIT success (77.3ms): accepts?@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-protection-2.0.8.1/lib/rack/protection/ip_spoofing.rb:14 -> /tmp/_ruby_mjit_p25533u60.c 1231 | JIT success (125.4ms): call@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-protection-2.0.8.1/lib/rack/protection/json_csrf.rb:24 -> /tmp/_ruby_mjit_p25533u61.c 1232 | JIT success (85.0ms): call@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-protection-2.0.8.1/lib/rack/protection/path_traversal.rb:13 -> /tmp/_ruby_mjit_p25533u62.c 1233 | JIT success (137.4ms): cleanup@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-protection-2.0.8.1/lib/rack/protection/path_traversal.rb:21 -> /tmp/_ruby_mjit_p25533u63.c 1234 | JIT success (137.8ms): call@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-protection-2.0.8.1/lib/rack/protection/xss_header.rb:17 -> /tmp/_ruby_mjit_p25533u64.c 1235 | JIT success (49.4ms): call@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:907 -> /tmp/_ruby_mjit_p25533u65.c 1236 | JIT success (253.3ms): call!@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:911 -> /tmp/_ruby_mjit_p25533u66.c 1237 | JIT success (945.0ms): initialize@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/indifferent_hash.rb:51 -> /tmp/_ruby_mjit_p25533u67.c 1238 | JIT success (961.3ms): initialize@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:136 -> /tmp/_ruby_mjit_p25533u68.c 1239 | JIT success (469.7ms): initialize@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/response.rb:42 -> /tmp/_ruby_mjit_p25533u69.c 1240 | JIT success (964.9ms): initialize@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/utils.rb:422 -> /tmp/_ruby_mjit_p25533u70.c 1241 | JIT success (36.1ms): block in @/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:1824 -> /tmp/_ruby_mjit_p25533u71.c 1242 | JIT success (30.2ms): clear@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/tilt-2.0.10/lib/tilt.rb:109 -> /tmp/_ruby_mjit_p25533u72.c 1243 | JIT success (32.6ms): block in call!@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:919 -> /tmp/_ruby_mjit_p25533u73.c 1244 | JIT success (119.4ms): dispatch!@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:1087 -> /tmp/_ruby_mjit_p25533u74.c 1245 | JIT success (975.5ms): params@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:78 -> /tmp/_ruby_mjit_p25533u75.c 1246 | JIT success (973.5ms): params@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/request.rb:31 -> /tmp/_ruby_mjit_p25533u76.c 1247 | JIT success (55.4ms): params@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/request.rb:468 -> /tmp/_ruby_mjit_p25533u77.c 1248 | JIT success (182.2ms): GET@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/request.rb:426 -> /tmp/_ruby_mjit_p25533u78.c 1249 | JIT success (51.2ms): parse_query@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/request.rb:589 -> /tmp/_ruby_mjit_p25533u79.c 1250 | JIT success (68.0ms): query_parser@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/request.rb:585 -> /tmp/_ruby_mjit_p25533u80.c 1251 | JIT success (209.4ms): parse_nested_query@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/query_parser.rb:64 -> /tmp/_ruby_mjit_p25533u81.c 1252 | JIT success (41.3ms): make_params@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/query_parser.rb:124 -> /tmp/_ruby_mjit_p25533u82.c 1253 | JIT success (39.7ms): initialize@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/query_parser.rb:159 -> /tmp/_ruby_mjit_p25533u83.c 1254 | JIT success (90.7ms): to_h@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/query_parser.rb:197 -> /tmp/_ruby_mjit_p25533u84.c 1255 | JIT success (268.7ms): POST@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/request.rb:440 -> /tmp/_ruby_mjit_p25533u85.c 1256 | JIT success (187.5ms): form_data?@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/request.rb:412 -> /tmp/_ruby_mjit_p25533u86.c 1257 | JIT success (83.3ms): parseable_data?@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/request.rb:421 -> /tmp/_ruby_mjit_p25533u87.c 1258 | JIT success (83.5ms): merge!@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/indifferent_hash.rb:135 -> /tmp/_ruby_mjit_p25533u88.c 1259 | JIT success (950.5ms): block in merge!@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/indifferent_hash.rb:136 -> /tmp/_ruby_mjit_p25533u89.c 1260 | JIT success (67.0ms): block in dispatch!@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:1095 -> /tmp/_ruby_mjit_p25533u90.c 1261 | JIT success (50.3ms): static?@(eval):1 -> /tmp/_ruby_mjit_p25533u91.c 1262 | JIT success (83.1ms): block in @/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:1829 -> /tmp/_ruby_mjit_p25533u92.c 1263 | JIT success (144.0ms): route!@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:982 -> /tmp/_ruby_mjit_p25533u93.c 1264 | JIT success (89.8ms): block in route!@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:984 -> /tmp/_ruby_mjit_p25533u94.c 1265 | JIT success (381.7ms): process_route@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:1014 -> /tmp/_ruby_mjit_p25533u95.c 1266 | JIT success (87.1ms): path_info@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/request.rb:154 -> /tmp/_ruby_mjit_p25533u96.c 1267 | JIT inline: strict_paths?@(eval):1 => strict_paths@(eval):1 1268 | JIT success (46.2ms): strict_paths?@(eval):1 -> /tmp/_ruby_mjit_p25533u97.c 1269 | JIT success (19.9ms): strict_paths@(eval):1 -> /tmp/_ruby_mjit_p25533u98.c 1270 | JIT success (137.8ms): params@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/mustermann-1.1.1/lib/mustermann/pattern.rb:204 -> /tmp/_ruby_mjit_p25533u99.c 1271 | JIT success (171.5ms): match@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/2.8.0/forwardable.rb:226 -> /tmp/_ruby_mjit_p25533u100.c 1272 | JIT success (174.1ms): named_captures@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/2.8.0/forwardable.rb:226 -> /tmp/_ruby_mjit_p25533u101.c 1273 | JIT compaction (17.8ms): Compacted 100 methods -> /tmp/_ruby_mjit_p25533u133.so 1274 | JIT recompile: level=@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/2.8.0/logger.rb:250 1275 | JIT recompile: initialize@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/2.8.0/logger/log_device.rb:14 1276 | JIT recompile: call@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-protection-2.0.8.1/lib/rack/protection/base.rb:45 1277 | JIT recompile: initialize@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/request.rb:50 1278 | JIT recompile: call!@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:911 1279 | JIT recompile: initialize@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/response.rb:42 1280 | JIT recompile: []=@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/utils.rb:456 1281 | JIT success (1021.2ms): []=@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/utils.rb:456 -> /tmp/_ruby_mjit_p25533u140.c 1282 | JIT success (271.4ms): level=@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/2.8.0/logger.rb:250 -> /tmp/_ruby_mjit_p25533u134.c 1283 | JIT success (57.2ms): call@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-protection-2.0.8.1/lib/rack/protection/base.rb:45 -> /tmp/_ruby_mjit_p25533u136.c 1284 | JIT success (937.3ms): initialize@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/request.rb:50 -> /tmp/_ruby_mjit_p25533u137.c 1285 | JIT success (48.9ms): force_encoding@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:1761 -> /tmp/_ruby_mjit_p25533u102.c 1286 | JIT inline: force_encoding@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:1749 => settings@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:934 1287 | JIT success (151.3ms): force_encoding@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:1749 -> /tmp/_ruby_mjit_p25533u103.c 1288 | JIT success (959.9ms): respond_to?@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/mustermann-1.1.1/lib/mustermann/pattern.rb:353 -> /tmp/_ruby_mjit_p25533u104.c 1289 | JIT compaction (18.0ms): Compacted 100 methods -> /tmp/_ruby_mjit_p25533u141.so 1290 | 1291 | NaN rps 1292 | [MJIT_COUNTER] total_calls of active_units: 1293 | 320000: get_header@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/request.rb:62 1294 | 220012: block in set@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:1238 1295 | 200000: settings@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:939 1296 | 160000: []@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/utils.rb:452 1297 | 140000: []=@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/utils.rb:456 1298 | 80000: filter!@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:976 1299 | 80000: block in content_type@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:346 1300 | 80000: block in @/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:1822 1301 | 60000: request_method@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/request.rb:157 1302 | 60000: query_string@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/request.rb:158 1303 | 60000: invoke@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:1071 1304 | 60000: body@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:254 1305 | 60000: block in invoke@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:1072 1306 | 46990: settings@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:934 1307 | 40000: type@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/media_type.rb:16 1308 | 40000: set_header@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/response.rb:128 1309 | 40000: set_header@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/request.rb:78 1310 | 40000: media_type@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/request.rb:383 1311 | 40000: level=@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/2.8.0/logger.rb:250 1312 | 40000: initialize@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/request.rb:50 1313 | 40000: initialize@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/request.rb:26 1314 | 40000: html?@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-protection-2.0.8.1/lib/rack/protection/base.rb:120 1315 | 40000: each@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/utils.rb:440 1316 | 40000: drop_body?@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:182 1317 | 40000: content_type@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/request.rb:271 1318 | 40000: call@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-protection-2.0.8.1/lib/rack/protection/base.rb:45 1319 | 40000: block in html?@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-protection-2.0.8.1/lib/rack/protection/base.rb:121 1320 | 40000: block in each@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/utils.rb:441 1321 | 40000: block in @/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:1828 1322 | 40000: []@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/utils.rb:414 1323 | 20002: environment@(eval):1 1324 | 20001: development?@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:1420 1325 | 20000: to_h@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/query_parser.rb:197 1326 | 20000: synchronize@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:1726 1327 | 20000: strict_paths?@(eval):1 1328 | 20000: static?@(eval):1 1329 | 20000: set_dev@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/2.8.0/logger/log_device.rb:79 1330 | 20000: safe?@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-protection-2.0.8.1/lib/rack/protection/base.rb:37 1331 | 20000: route!@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:982 1332 | 20000: respond_to?@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/mustermann-1.1.1/lib/mustermann/pattern.rb:353 1333 | 20000: query_parser@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/request.rb:585 1334 | 20000: prototype@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:1477 1335 | 20000: process_route@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:1014 1336 | 20000: path_info@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/request.rb:154 1337 | 20000: parseable_data?@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/request.rb:421 1338 | 20000: parse_query@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/request.rb:589 1339 | 20000: parse_nested_query@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/query_parser.rb:64 1340 | 20000: params@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:78 1341 | 20000: params@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/request.rb:468 1342 | 20000: params@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/request.rb:31 1343 | 20000: params@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/mustermann-1.1.1/lib/mustermann/pattern.rb:204 1344 | 20000: named_captures@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/2.8.0/forwardable.rb:226 1345 | 20000: mon_initialize@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/2.8.0/monitor.rb:230 1346 | 20000: merge!@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/indifferent_hash.rb:135 1347 | 20000: match@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/2.8.0/forwardable.rb:226 1348 | 20000: make_params@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/query_parser.rb:124 1349 | 20000: lock?@(eval):1 1350 | 20000: initialize@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/indifferent_hash.rb:51 1351 | 20000: initialize@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:136 1352 | 20000: initialize@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/utils.rb:422 1353 | 20000: initialize@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/query_parser.rb:159 1354 | 20000: initialize@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/2.8.0/logger/formatter.rb:10 1355 | 20000: initialize@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/2.8.0/logger.rb:379 1356 | 20000: form_data?@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/request.rb:412 1357 | 20000: force_encoding@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:1761 1358 | 20000: force_encoding@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:1749 1359 | 20000: dispatch!@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:1087 1360 | 20000: datetime_format=@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/2.8.0/logger.rb:279 1361 | 20000: clock_time@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/utils.rb:83 1362 | 20000: clear@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/tilt-2.0.10/lib/tilt.rb:109 1363 | 20000: cleanup@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-protection-2.0.8.1/lib/rack/protection/path_traversal.rb:21 1364 | 20000: call@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/show_exceptions.rb:21 1365 | 20000: call@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:907 1366 | 20000: call@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:229 1367 | 20000: call@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:223 1368 | 20000: call@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:1950 1369 | 20000: call@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:193 1370 | 20000: call@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:1502 1371 | 20000: call@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-protection-2.0.8.1/lib/rack/protection/xss_header.rb:17 1372 | 20000: call@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-protection-2.0.8.1/lib/rack/protection/path_traversal.rb:13 1373 | 20000: call@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-protection-2.0.8.1/lib/rack/protection/json_csrf.rb:24 1374 | 20000: call@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-protection-2.0.8.1/lib/rack/protection/frame_options.rb:30 1375 | 20000: call@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/method_override.rb:15 1376 | 20000: call@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/logger.rb:12 1377 | 20000: call@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/head.rb:11 1378 | 20000: call@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/common_logger.rb:36 1379 | 20000: block in route!@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:984 1380 | 20000: block in merge!@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/indifferent_hash.rb:136 1381 | 20000: block in dispatch!@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:1095 1382 | 20000: block in call@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:1503 1383 | 20000: block in call!@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:919 1384 | 20000: block in @/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:1829 1385 | 20000: block in @/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/sinatra-2.0.8.1/lib/sinatra/base.rb:1824 1386 | 20000: allowed_methods@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/method_override.rb:40 1387 | 20000: accepts?@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-protection-2.0.8.1/lib/rack/protection/ip_spoofing.rb:14 1388 | 20000: accepts?@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-protection-2.0.8.1/lib/rack/protection/http_origin.rb:30 1389 | 20000: POST@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/request.rb:440 1390 | 20000: GET@/home/k0kubun/.rbenv/versions/ruby/lib/ruby/gems/2.8.0/gems/rack-2.2.2/lib/rack/request.rb:426 1391 | 19998: strict_paths@(eval):1 1392 | 19998: lock@(eval):1 1393 | ``` 1394 | 1395 | (The last output is manually sorted by counts) 1396 | 1397 | ## benchmark-driver 1398 | 1399 | ``` 1400 | $ benchmark-driver driver.yml --rbenv 'ruby;ruby+jit::ruby --jit;jruby-9.2.11.0;jruby-9.2.11.0+indy::jruby-9.2.11.0 -Xcompile.invokedynamic=true;truffleruby-20.0.0' -v 1401 | ruby: ruby 2.8.0dev (2020-03-14T09:17:17Z mjit-optcarrot-com.. 666194559f) [x86_64-linux] 1402 | ruby+jit: ruby 2.8.0dev (2020-03-14T09:17:17Z mjit-optcarrot-com.. 666194559f) +JIT [x86_64-linux] 1403 | jruby-9.2.11.0: jruby 9.2.11.0 (2.5.7) 2020-03-02 612d7a05a6 Java HotSpot(TM) 64-Bit Server VM 25.211-b12 on 1.8.0_211-b12 +jit [linux-x86_64] 1404 | jruby-9.2.11.0+indy: jruby 9.2.11.0 (2.5.7) 2020-03-02 612d7a05a6 Java HotSpot(TM) 64-Bit Server VM 25.211-b12 on 1.8.0_211-b12 +indy +jit [linux-x86_64] 1405 | truffleruby-20.0.0: truffleruby 20.0.0, like ruby 2.6.5, GraalVM CE Native [x86_64-linux] 1406 | Calculating ------------------------------------- 1407 | ruby ruby+jit jruby-9.2.11.0 jruby-9.2.11.0+indy truffleruby-20.0.0 1408 | sinatra 15.532k 13.889k 13.510k 17.720k 22.081k i/s - 100.000k times in 6.438121s 7.200001s 7.401869s 5.643458s 4.528695s 1409 | 1410 | Comparison: 1411 | sinatra 1412 | truffleruby-20.0.0: 22081.4 i/s 1413 | jruby-9.2.11.0+indy: 17719.6 i/s - 1.25x slower 1414 | ruby: 15532.5 i/s - 1.42x slower 1415 | ruby+jit: 13888.9 i/s - 1.59x slower 1416 | jruby-9.2.11.0: 13510.1 i/s - 1.63x slower 1417 | ``` 1418 | 1419 | ## License 1420 | 1421 | MIT License 1422 | -------------------------------------------------------------------------------- /app.rb: -------------------------------------------------------------------------------- 1 | require 'sinatra' 2 | 3 | get '/' do 4 | 'apples, oranges & bananas' 5 | end 6 | -------------------------------------------------------------------------------- /bench.rb: -------------------------------------------------------------------------------- 1 | require_relative 'app' 2 | 3 | warmup = Integer(ENV.fetch('WARMUP', '0')) 4 | requests = Integer(ENV.fetch('REQUESTS', '20000')) 5 | 6 | app = Sinatra::Application 7 | env = Rack::MockRequest.env_for('/', { method: Rack::GET }) 8 | 9 | # warmup 10 | if warmup > 0 11 | i = 1 12 | while i <= warmup 13 | app.call(env.dup) 14 | print "warmup: #{i}/#{warmup}\r" 15 | i += 1 16 | end 17 | puts 18 | end 19 | 20 | if defined?(RubyVM::MJIT) && RubyVM::MJIT.enabled? 21 | RubyVM::MJIT.pause 22 | app.call(env.dup) # issue recompile 23 | RubyVM::MJIT.resume 24 | RubyVM::MJIT.pause # finish recompile 25 | app.call(env.dup) # issue recompile 26 | RubyVM::MJIT.resume 27 | RubyVM::MJIT.pause # finish recompile 28 | end 29 | if defined?(RubyVM) && RubyVM.respond_to?(:reset_debug_counters) 30 | RubyVM.reset_debug_counters 31 | end 32 | 33 | # benchmark 34 | if use_perf = ENV.key?('PERF') 35 | require 'shellwords' 36 | pid = Process.spawn('perf', *ENV['PERF'].shellsplit, '-p', Process.pid.to_s) 37 | end 38 | i = 1 39 | time = 0.0 40 | while i <= requests 41 | dup_env = env.dup 42 | before = Process.clock_gettime(Process::CLOCK_MONOTONIC) 43 | app.call(dup_env) 44 | after = Process.clock_gettime(Process::CLOCK_MONOTONIC) 45 | 46 | time += after - before 47 | print "benchmark: #{i}/#{requests}\r" 48 | i += 1 49 | end 50 | puts 51 | 52 | if defined?(RubyVM) && RubyVM.respond_to?(:reset_debug_counters) 53 | RubyVM.show_debug_counters 54 | end 55 | if use_perf 56 | Process.kill(:INT, pid) 57 | Process.wait(pid) 58 | end 59 | 60 | # print result 61 | puts "#{"%.2f" % (requests.to_f / time)} rps" 62 | -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | benchmark-driver/sinatra 4 | 5 | 6 | 7 |

benchmark-driver/sinatra flamegraph

8 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /driver.yml: -------------------------------------------------------------------------------- 1 | prelude: | 2 | require 'sinatra/base' 3 | 4 | class App < Sinatra::Base 5 | get '/' do 6 | 'apples, oranges & bananas' 7 | end 8 | end 9 | 10 | app = App 11 | env = Rack::MockRequest.env_for('/', { method: Rack::GET }) 12 | 13 | i = 0 14 | while i < 100000 15 | app.call(env.dup) 16 | i += 1 17 | end 18 | if defined?(RubyVM::MJIT) && RubyVM::MJIT.enabled? 19 | RubyVM::MJIT.pause 20 | end 21 | 22 | benchmark: 23 | sinatra: app.call(env.dup) 24 | 25 | loop_count: 100000 26 | -------------------------------------------------------------------------------- /profile.rb: -------------------------------------------------------------------------------- 1 | require_relative 'app' 2 | require 'stackprof' 3 | 4 | requests = Integer(ENV.fetch('REQUESTS', '100000')) 5 | 6 | app = Sinatra::Application 7 | env = Rack::MockRequest.env_for('/', { method: Rack::GET }) 8 | 9 | # warmup 10 | i = 0 11 | while i < requests 12 | app.call(env.dup) 13 | i += 1 14 | end 15 | 16 | if defined?(RubyVM::MJIT) && RubyVM::MJIT.enabled? 17 | RubyVM::MJIT.pause 18 | app.call(env.dup) # issue recompile 19 | RubyVM::MJIT.resume 20 | RubyVM::MJIT.pause # finish recompile 21 | end 22 | 23 | StackProf.run(mode: ENV.fetch('MODE', 'cpu').to_sym, interval: Integer(ENV.fetch('INTERVAL', '1')), out: 'stackprof.dump') do 24 | i = 0 25 | while i < requests 26 | app.call(env.dup) 27 | i += 1 28 | end 29 | end 30 | --------------------------------------------------------------------------------