ruby/benchmark/vm_ivar_set_on_instance.yml
Jean Boussier e7fb87ee3a Populate ivar caches for types other than T_OBJECT
`vm_setinstancevariable` had a codepath to try to match the inline
cache for types other than T_OBJECT, but the cache population path
in `vm_setivar_slowpath` was exclusive to T_OBJECT, so `vm_setivar_default`
would never match anything.

This commit improves `vm_setivar_slowpath` so that it is capable of
filling the cache for all types, and adds a `vm_setivar_class` codepath
for `T_CLASS` and `T_MODULE`.

`vm_setivar`, `vm_setivar_default` and `vm_setivar_class` could be unified,
but based on the very explicit `NOINLINE` I assume they were split to minimize
codesize.

```
compare-ruby: ruby 3.5.0dev (2025-08-27T14:58:58Z merge-vm-setivar-d.. 5b749d8e53) +PRISM [arm64-darwin24]
built-ruby: ruby 3.5.0dev (2025-08-27T16:30:31Z setivar-cache-gene.. 4fe78ff296) +PRISM [arm64-darwin24]

|                         |compare-ruby|built-ruby|
|:------------------------|-----------:|---------:|
|vm_ivar_set_on_instance  |     161.809|   164.688|
|                         |           -|     1.02x|
|vm_ivar_set_on_generic   |      58.769|   115.638|
|                         |           -|     1.97x|
|vm_ivar_set_on_class     |      70.034|   141.042|
|                         |           -|     2.01x|
```
2025-08-28 09:25:51 +02:00

95 lines
1.6 KiB
YAML

prelude: |
class TheClass
def initialize
@levar = 1
@v0 = 1
@v1 = 2
@v3 = 3
end
def set_value_loop
# 100k
i = 0
while i < 100_000
# 10 times to de-emphasize loop overhead
@levar = i
@levar = i
@levar = i
@levar = i
@levar = i
@levar = i
@levar = i
@levar = i
@levar = i
@levar = i
i += 1
end
end
end
class Generic < Time
def initialize
@levar = 1
@v0 = 1
@v1 = 2
@v3 = 3
end
def set_value_loop
# 100k
i = 0
while i < 100_000
# 10 times to de-emphasize loop overhead
@levar = i
@levar = i
@levar = i
@levar = i
@levar = i
@levar = i
@levar = i
@levar = i
@levar = i
@levar = i
i += 1
end
end
end
obj = TheClass.new
gen_obj = Generic.new
class SomeClass
@levar = 1
@v0 = 1
@v1 = 2
@v3 = 3
def self.set_value_loop
# 100k
i = 0
while i < 100_000
# 10 times to de-emphasize loop overhead
@levar = i
@levar = i
@levar = i
@levar = i
@levar = i
@levar = i
@levar = i
@levar = i
@levar = i
@levar = i
i += 1
end
end
end
benchmark:
vm_ivar_set_on_instance: |
obj.set_value_loop
vm_ivar_set_on_generic: |
gen_obj.set_value_loop
vm_ivar_set_on_class: |
SomeClass.set_value_loop
loop_count: 100