ruby/benchmark/vm_ivar_get.yml
Jean Boussier b6d4882c05 YJIT: getinstancevariable cache indexes for types other than T_OBJECT
While accessing the ivars of other types is too complicated to
realistically generate the ASM for it, we can at least provide
the ivar index as to not have to lookup the shape tree every
time.

```
compare-ruby: ruby 3.5.0dev (2025-08-27T14:58:58Z merge-vm-setivar-d.. 5b749d8e53) +YJIT +PRISM [arm64-darwin24]
built-ruby: ruby 3.5.0dev (2025-08-28T17:58:32Z yjit-get-exivar efaa8c9b09) +YJIT +PRISM [arm64-darwin24]

|                           |compare-ruby|built-ruby|
|:--------------------------|-----------:|---------:|
|vm_ivar_get_on_obj         |     930.458|   936.865|
|                           |           -|     1.01x|
|vm_ivar_get_on_class       |     134.471|   431.622|
|                           |           -|     3.21x|
|vm_ivar_get_on_generic     |     146.679|   284.408|
|                           |           -|     1.94x|
```

Co-Authored-By: Aaron Patterson <tenderlove@ruby-lang.org>
2025-08-29 00:02:29 +02:00

101 lines
1.7 KiB
YAML

prelude: |
class Example
def initialize
@levar = 1
@v0 = 1
@v1 = 2
@v3 = 3
end
def get_value_loop
sum = 0
i = 0
while i < 100_000
# 10 times to de-emphasize loop overhead
sum += @levar
sum += @levar
sum += @levar
sum += @levar
sum += @levar
sum += @levar
sum += @levar
sum += @levar
sum += @levar
sum += @levar
i += 1
end
return sum
end
@levar = 1
@v0 = 1
@v1 = 2
@v3 = 3
def self.get_value_loop
sum = 0
i = 0
while i < 100_000
# 10 times to de-emphasize loop overhead
sum += @levar
sum += @levar
sum += @levar
sum += @levar
sum += @levar
sum += @levar
sum += @levar
sum += @levar
sum += @levar
sum += @levar
i += 1
end
return sum
end
end
class GenExample < Time
def initialize
@levar = 1
@v0 = 1
@v1 = 2
@v3 = 3
end
def get_value_loop
sum = 0
i = 0
while i < 100_000
# 10 times to de-emphasize loop overhead
sum += @levar
sum += @levar
sum += @levar
sum += @levar
sum += @levar
sum += @levar
sum += @levar
sum += @levar
sum += @levar
sum += @levar
i += 1
end
return sum
end
end
obj = Example.new
gen = GenExample.new
benchmark:
vm_ivar_get_on_obj: |
obj.get_value_loop
vm_ivar_get_on_class: |
Example.get_value_loop
vm_ivar_get_on_generic: |
gen.get_value_loop
loop_count: 100