[ruby-core:104701] [Ruby master Feature#18042] YARV code optimization
From:
motoroller95@...
Date:
2021-07-27 11:46:15 UTC
List:
ruby-core #104701
Issue #18042 has been updated by motoroller (Iskandar Gohar). @nobu Yes you are right, but I want to say that we don't need temp object in this case, so wy can't we do some optimizations? or one more case: code like this `[1,2,3,4,5,6].select(&:even?).count` will allocate new array only for return his size, isn't it superfluous? one more think I thought in rails programmers like create helper methods like ```ruby def hours_to_minutes(hours) hours * SECONDS_PER_MINUTE end def payments_sum sum_over_period(user.payments) end ``` first example it's simple calculation and maybe we can transform body to inline variant? second example just call other methods, it's wrapper and we can remove this call and use only body. ---------------------------------------- Feature #18042: YARV code optimization https://bugs.ruby-lang.org/issues/18042#change-93027 * Author: motoroller (Iskandar Gohar) * Status: Feedback * Priority: Normal ---------------------------------------- Hi! Long period of time I think about programmatically code optimization for YARV. In compiled languages like C/C++ the compiler can do whatever it wants with the code and does for performance optimization. Firstly, ruby developers think about code readability, secondary about performance. Because ruby translates .rb file into bytecode we can do whit this bytecode anything to win in performance and do not lose in the expressiveness of the code. But I came to the conclusion that a static bytecode optimizer is not possible, because in translation stage we don't know about which object/class we use. So, did someone think about runtime code analyzing? If we have some type of statistic we can dynamically transform bytecode to optimized version, use optimized version of C functions. Also I thought if we have statistic we can reduce some GC overhead ```ruby # before array.map(&:method1).map(&:method2) # if I know for sure that map is not overridden and calls from Enumerable I can rebuild code like this array.map do _1.method1 _1.method2 end ``` In this example 2 `map` calls generate one redundant array which will be destructed by GC, so we can transform it to seconds version. It can be applied not only for `map/select` functions, but many other. What do you think about it? -- https://bugs.ruby-lang.org/ Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe> <http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>