mirror of
https://github.com/ruby/ruby.git
synced 2026-01-26 04:07:58 +00:00
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>
101 lines
1.7 KiB
YAML
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
|