Wardite perf 結果
aarch64にて
考察
結局チリツモか...????
98.93%--vm_exec_core の中には支配的な関数なし
rb_vm_set_ivar_id ??? なぜ?
そんなに大量に呼んでます?
rb_class_new_instance_pass_kw が多い
まぁ〜I32 ry
全体に、関数シンボルが潰れてちゃんと追えないお...
code:res.txt
# Children Self Command Shared Object Symbol
# ........ ........ ....... ..................... ....................................................
#
100.00% 0.00% ruby ruby . _start
|
---_start
__libc_start_main
0xffffbd7173fc
main
ruby_run_node
rb_ec_exec_node
rb_vm_exec
|
|--98.93%--vm_exec_core
| |
| |--9.67%--0xffffbe152a58
| | |
| | |--7.26%--rb_vm_set_ivar_id
| | | |
| | | |--2.86%--rb_shape_get_iv_index
| | | |
| | | |--1.91%--rb_shape_get_shape_by_id@plt
| | | |
| | | --0.94%--rb_shape_get_shape_by_id
| | |
| | |--0.81%--rb_shape_get_shape_by_id@plt
| | |
| | --0.67%--rb_shape_get_shape_by_id
| |
| |--7.32%--0xffffbe1525cc
| | |
| | --6.62%--rb_class_new_instance_pass_kw
| | |
| | |--2.52%--vm_call0_cc
| | | |
| | | |--1.51%--vm_call0_body
| | | | |
| | | | --0.81%--vm_call_iseq_setup
| | | |
| | | --0.67%--rb_vm_exec
| | |
| | |--2.22%--rb_class_allocate_instance
| | | |
| | | --2.15%--newobj_alloc
| | | |
| | | --1.58%--gc_continue
| | | |
| | | --1.41%--gc_sweep_step
| | | |
| | | --0.94%--obj_free
| | |
| | --0.50%--rb_call0
| |
| |--5.78%--0xffffbe14a65c
| | |
| | --4.90%--rb_class_new_instance_pass_kw
| | |
| | |--1.95%--rb_class_allocate_instance
| | | newobj_alloc
| | | |
| | | --1.38%--gc_continue
| | | |
| | | --1.24%--gc_sweep_step
| | | |
| | | --0.74%--obj_free
| | |
| | --1.81%--vm_call0_cc
| | |
| | |--0.94%--vm_call0_body
| | | |
| | | --0.57%--vm_call_iseq_setup
| | |
| | --0.74%--rb_vm_exec
| |
| |--2.69%--vm_invoke_iseq_block
| | |
| | --1.07%--CALLER_SETUP_ARG
| |
| |--2.25%--0xffffbe15e4e4
| | |
| | --2.18%--rb_ary_cat
| | |
| | |--0.94%--ary_ensure_room_for_push
| | |
| | --0.57%--ary_memcpy0
| |
| |--1.58%--0xffffbe142bd8
| | |
| | --1.34%--pack_unpack_internal
| |
| |--1.41%--0xffffbe156ad0
| | |
| | --1.24%--rb_range_new
| | |
| | --0.77%--rb_obj_alloc
| | |
| | --0.71%--rb_struct_alloc_noinit
| |
| |--1.41%--rb_yarv_ary_entry_internal
| |
| |--1.31%--0xffffbe18a5a0
| | |
| | --1.14%--pack_pack
| |
| |--1.24%--0xffffbe156bb0
| | |
| | --1.18%--rb_ary_aref
| | |
| | --0.57%--rb_arithmetic_sequence_beg_len_step
| |
| |--1.01%--0xffffbe15ad90
| | |
| | --0.91%--rb_class_new_instance_pass_kw
| |
...
ちなみにyjitしないとどうなる?
ハーン
vm_call_cfunc_with_frame がでてくる
つまり数値計算などほとんどC関数になっているものがそのまま出てくる
やはりYJITはてきめんに効いている
rb_class_new_instance_pass_kw はいる
vm_call_ivar もいる、変数、変数ねえ...
hash操作みたいなのも出てくる、これもYJITされやすい?
code:nojit.txt
# Children Self Command Shared Object Symbol
# ........ ........ ....... ..................... ....................................................
#
100.00% 0.00% ruby ruby . _start
|
---_start
__libc_start_main
0xffff8d8c73fc
main
ruby_run_node
rb_ec_exec_node
rb_vm_exec
|
|--83.24%--vm_exec_core
| |
| |--19.28%--vm_call_cfunc_with_frame
| | |
| | |--7.63%--rb_class_new_instance_pass_kw
| | | |
| | | |--3.43%--vm_call0_cc
| | | | |
| | | | |--1.75%--rb_vm_exec
| | | | | |
| | | | | --0.91%--vm_exec_core
| | | | |
| | | | --1.31%--vm_call0_body
| | | | |
| | | | --0.54%--vm_call_iseq_setup
| | | |
| | | --2.62%--rb_class_allocate_instance
| | | |
| | | --2.52%--newobj_alloc
| | | |
| | | |--1.41%--gc_continue
| | | | |
| | | | --1.24%--gc_sweep_step
| | | | |
| | | | --0.77%--obj_free
| | | |
| | | --0.74%--gc_start
| | | |
| | | --0.54%--gc_sweep
| | | |
| | | --0.50%--gc_sweep_step
| | |
| | |--1.88%--rb_ary_cat
| | |
| | |--0.81%--rb_ary_pop
| | |
| | |--0.74%--rb_big_and
| | |
| | --0.67%--rb_str_aref_m
| |
| |--8.10%--vm_call_ivar
| |
| |--5.11%--rb_st_lookup
| | |
| | --1.85%--find_table_entry_ind
| |
| |--2.32%--rb_range_new
| | |
| | |--1.48%--rb_obj_alloc
| | | |
| | | --1.14%--rb_struct_alloc_noinit
| | | |
| | | --0.54%--rb_wb_protected_newobj_of
| | | |
| | | --0.50%--newobj_alloc
| | |
| | --0.57%--rb_obj_freeze
| |
| |--1.38%--vm_invoke_iseq_block
| | |
| | --0.50%--CALLER_SETUP_ARG
| |
| |--1.28%--rb_vm_opt_getconstant_path
| |
| |--0.94%--pack_pack
| |
| |--0.87%--vm_call_attrset
| |
| |--0.71%--pack_unpack_internal
| |
うーん普通に命令別集計、オブジェクトの作られっぷりの集計をしたほうがいいな
そうするとeBPF使えるなあ...
まあ、tracepointで追える範囲はある
code:tr.rb
$COUNTER = {}
TracePoint.trace(:call) do |tp|
if %i(I32 I64 F32 F64).include?(tp.method_id)
$COUNTERtp.method_id ||= 0
$COUNTERtp.method_id += 1
end
end
END {
pp $COUNTER
}
code:res.txt
$ bundle exec ruby examples/grayscale.rb --wasm-file tmp/fukuoka_ecl_imagetest.wasm --source tmp/source.png --dest tmp/result.png --width 150 --height 150
warning: unimplemented section: 0x00
warning: unimplemented section: 0x00
warning: unimplemented section: 0x00
created: tmp/result.png
{:I32=>18845604, :I64=>1710552, :F32=>247500}
1800万回呼ばれる、オブジェクトも1800万回作られますよと
そうかー...
I64も想像よりできてるが、、1/10のオーダーなので、I32をいじると良さそう
#wardite