Skip to content

Build options for performance tuning

Soichiro Isshiki edited this page Feb 1, 2025 · 2 revisions

Here is examples of output for build options that is useful for performance measurement and tuning.

sample code

This is a sample code used in this section. Everyone loves Fibonacci.

def fib n
  if n < 3
    1
  else
    fib(n-1) + fib(n-2)
  end
end

puts fib(34)

print bytecode (build with --features emit-bc)

Print bytecode instructions for methods and blocks. BBx means basic block ID.

<fib> /home/monochrome/monoruby/benchmark/app_fib.rb:1
FuncId(1749) SIMPLE stack reg_num:5 local_vars:1 temp:3
ParamsInfo { required_num: 1, reqopt_num: 1, pos_num: 1, args_names: [Some(n)], kw_names: [], kw_rest: None, block_param: None }
[]
  BB0
    :00000 [02] init_method reg:4 arg:1 stack_offset:8
    :00001 [03] _%2 = %1 < 3: i16
    :00002 [02] condnotbr _%2 => BB2
  BB1
    :00003 [03] %2 = 1: i32
    :00004 [02] ret %2
  BB2
    :00005 [03] %2 = %1 - 1: i16
    :00006 [03] %2 = %0.fib(%2)
    :00008 [04] %3 = %1 - 2: i16
    :00009 [04] %3 = %0.fib(%3)
    :00011 [03] %2 = %2 + %3
    :00012 [02] ret %2

print JIT-compiled assembly (build with --features emit-asm)

Print JIT-compiled assembly with corresponding bytecode instructions and time required for compilation. BBx means basic block ID.

==> start whole compile: FuncId(1749) <Object#fib> self_class: #<Class:main> /home/monochrome/monoruby/benchmark/app_fib.rb:1
>>>Method[0] FuncId(1749) <Object#fib> self_class: #<Class:main>
offset:Pos(165222) code: 423 bytes  data: 0 bytes
      000000: push   rbp
      000001: mov    rbp,rsp
      000004: sub    rsp,0x80
      00000b: test   BYTE PTR [r14-0x1],0x80
      000010: jne    0x2c
      000016: movabs rax,0x4
      000020: mov    QWORD PTR [r14-0x28],rax
      000024: mov    QWORD PTR [r14-0x30],rax
      000028: mov    QWORD PTR [r14-0x38],rax
  BB0
    :00000 init_method reg:4 arg:1 stack_offset:8
    :00001 _%2 = %1 < 3: i16                    [Integer][Integer]
      00002c: mov    rdi,QWORD PTR [r14-0x20]
      000030: test   rdi,0x1
      000037: je     0xffddbcf
      00003d: cmp    rdi,0x7
      000041: jge    0x53
    :00002 condnotbr _%2 => BB2
  BB1
    :00003 %2 = 1: i32
    :00004 ret %2
      000047: movabs rax,0x3
      000051: leave
      000052: ret
  BB2
    :00005 %2 = %1 - 1: i16                     [Integer][Integer]
      000053: mov    rdi,QWORD PTR [r14-0x20]
      000057: sub    rdi,0x2
      00005b: jo     0xffddc7d
      000061: mov    r15,rdi
    :00006 %2 = %0.fib(%2)                      [#<Class:main>] FuncId(1749)
      000064: mov    eax,DWORD PTR [rip+0x1ffd9d3c]        # 0x1ffd9da6
      00006a: cmp    DWORD PTR [rip+0x1ffd7a2a],eax        # 0x1ffd7a9a
      000070: jne    0xffddc8c
      000076: mov    rdi,QWORD PTR [r14-0x18]
      00007a: mov    r13,rdi
      00007d: cmp    DWORD PTR [rip+0x1ffd7a2e],0x0        # 0x1ffd7ab2
      000084: jne    0xffddc9b
      00008a: mov    QWORD PTR [rsp-0x48],r15
      00008f: sub    rsp,0x20
      000093: xor    rax,rax
      000096: push   rax
      000097: movabs rax,0x10000005000006d5
      0000a1: push   rax
      0000a2: xor    rax,rax
      0000a5: push   rax
      0000a6: push   r13
      0000a8: add    rsp,0x40
      0000ac: lea    r14,[rsp-0x28]
      0000b1: mov    QWORD PTR [rsp-0x20],r14
      0000b6: mov    rdi,QWORD PTR [rbx]
      0000b9: lea    rsi,[rsp-0x18]
      0000be: mov    QWORD PTR [rsi],rdi
      0000c1: mov    QWORD PTR [rbx],rsi
      0000c4: call   0xfffffef9
      0000c9: lea    r14,[rbp-0x8]
      0000cd: mov    QWORD PTR [rbx],r14
      0000d0: mov    r14,QWORD PTR [rbp-0x10]
      0000d4: test   rax,rax
      0000d7: je     0xffddc13
      0000dd: mov    r15,rax
    :00007
    :00008 %3 = %1 - 2: i16                     [Integer][Integer]
      0000e0: mov    rdi,QWORD PTR [r14-0x20]
      0000e4: sub    rdi,0x4
      0000e8: jo     0xffddca9
      0000ee: mov    QWORD PTR [r14-0x28],r15
      0000f2: mov    r15,rdi
    :00009 %3 = %0.fib(%3)                      [#<Class:main>] FuncId(1749)
      0000f5: mov    eax,DWORD PTR [rip+0x1ffd9caf]        # 0x1ffd9daa
      0000fb: cmp    DWORD PTR [rip+0x1ffd7999],eax        # 0x1ffd7a9a
      000101: jne    0xffddcb8
      000107: mov    rdi,QWORD PTR [r14-0x18]
      00010b: mov    r13,rdi
      00010e: cmp    DWORD PTR [rip+0x1ffd799d],0x0        # 0x1ffd7ab2
      000115: jne    0xffddcc7
      00011b: mov    QWORD PTR [rsp-0x48],r15
      000120: sub    rsp,0x20
      000124: xor    rax,rax
      000127: push   rax
      000128: movabs rax,0x10000005000006d5
      000132: push   rax
      000133: xor    rax,rax
      000136: push   rax
      000137: push   r13
      000139: add    rsp,0x40
      00013d: lea    r14,[rsp-0x28]
      000142: mov    QWORD PTR [rsp-0x20],r14
      000147: mov    rdi,QWORD PTR [rbx]
      00014a: lea    rsi,[rsp-0x18]
      00014f: mov    QWORD PTR [rsi],rdi
      000152: mov    QWORD PTR [rbx],rsi
      000155: call   0xfffffef9
      00015a: lea    r14,[rbp-0x8]
      00015e: mov    QWORD PTR [rbx],r14
      000161: mov    r14,QWORD PTR [rbp-0x10]
      000165: test   rax,rax
      000168: je     0xffddc5b
      00016e: mov    r15,rax
    :00010
    :00011 %2 = %2 + %3                         [Integer][Integer]
      000171: mov    rdi,QWORD PTR [r14-0x28]
      000175: mov    rsi,r15
      000178: test   rdi,0x1
      00017f: je     0xffddc6a
      000185: test   rsi,0x1
      00018c: je     0xffddcd5
      000192: sub    rdi,0x1
      000196: add    rdi,rsi
      000199: jo     0xffddcdd
      00019f: mov    r15,rdi
    :00012 ret %2
      0001a2: mov    rax,r15
      0001a5: leave
      0001a6: ret
<<<
<== finished compile.

Clone this wiki locally