From: eregontp@... Date: 2020-07-15T14:30:58+00:00 Subject: [ruby-core:99176] [Ruby master Bug#17031] `Kernel#caller_locations(m, n)` should be optimized Issue #17031 has been updated by Eregon (Benoit Daloze). Could you post the results of running that on your computer? Then it's easier to see your point without needing to reproduce. ---------------------------------------- Bug #17031: `Kernel#caller_locations(m, n)` should be optimized https://bugs.ruby-lang.org/issues/17031#change-86555 * Author: marcandre (Marc-Andre Lafortune) * Status: Open * Priority: Normal * Backport: 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN ---------------------------------------- `Kernel#caller_locations(1, 1)` currently appears to needlessly allocate memory for the whole backtrace. It allocates ~20kB for a 800-deep stacktrace, vs 1.6 kB for a shallow backtrace. It is also much slower for long stacktraces: about 7x slower for a 800-deep backtrace than for a shallow one. Test used: ```ruby def do_something location = caller_locations(1, 1).first end def test(depth, trigger) do_something if depth == trigger test(depth - 1, trigger) unless depth == 0 end require 'benchmark/ips' Benchmark.ips do |x| x.report (:short_backtrace ) {test(800,800)} x.report (:long_backtrace ) {test(800, 0)} x.report (:no_caller_locations) {test(800, -1)} end require 'memory_profiler' MemoryProfiler.report { test(800,800) }.pretty_print(scale_bytes: true, detailed_report: false) MemoryProfiler.report { test(800, 0) }.pretty_print(scale_bytes: true, detailed_report: false) ``` Found when checking memory usage on RuboCop. -- https://bugs.ruby-lang.org/ Unsubscribe: