
Issue #19693 has been updated by Eregon (Benoit Daloze). Defining a `new` singleton method on the Data subclass, in Ruby and with explicit keyword arguments should be able to then use the literal kwargs optimization, but that means using `eval` or so and then needing to validate all argument names are valid local variable names (might already be the case, I don't know). Or a way to define a method in C with the same kwargs optimization, but that is currently not possible AFAIK. A more general optimization of keyword arguments could also work for this, like https://github.com/oracle/truffleruby/issues/2388 is an example of that, but it's not fully implemented yet. Another way is splitting `new` at every call site (for Data subclasses at least) + escape analysis + a Hash representation that can take e.g. 10 pairs and still escape analyze fine, then it should be the same as positional arguments if everything inlines (should be, it's not big methods). I'll try this on TruffleRuby when Data is implemented there. ---------------------------------------- Misc #19693: Data initialization is significantly slower than Struct https://bugs.ruby-lang.org/issues/19693#change-103315 * Author: janosch-x (Janosch Müller) * Status: Closed * Priority: Normal ---------------------------------------- Maybe there is potential to make it as fast as Struct? ```ruby require 'benchmark/ips' S = Struct.new(:a, :b, :c, :d, :e, :f, :g, :h, :i, :j) D = Data.define(:a, :b, :c, :d, :e, :f, :g, :h, :i, :j) Benchmark.ips do |x| x.report('Struct') { S.new(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) } x.report('Data') { D.new(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) } x.compare! end; 1 # => [...] # => Struct: 6916530.4 i/s # => Data: 1507259.5 i/s - 4.59x slower ``` -- https://bugs.ruby-lang.org/