File: caller_vs_raise_for_backtrace.rb

package info (click to toggle)
ruby-rspec 3.13.0c0e0m0s1-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 6,856 kB
  • sloc: ruby: 70,868; sh: 1,423; makefile: 99
file content (77 lines) | stat: -rw-r--r-- 2,125 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
require 'benchmark/ips'

def create_stack_trace(n, &block)
  return create_stack_trace(n - 1, &block) if n > 0
  yield
end

[10, 50, 100].each do |frames|
  create_stack_trace(frames) do
    Benchmark.ips do |x|
      x.report("use caller (#{caller.count} frames)") do
        exception = RuntimeError.new("boom")
        exception.set_backtrace caller
        exception.backtrace
      end

      x.report("use raise (#{caller.count} frames)") do
        exception = begin
          raise "boom"
        rescue => e
          e
        end

        exception.backtrace
      end

      x.compare!
    end
  end
end

__END__

Calculating -------------------------------------
use caller (16 frames)
                         4.986k i/100ms
use raise (16 frames)
                         4.255k i/100ms
-------------------------------------------------
use caller (16 frames)
                         52.927k (± 9.9%) i/s -    264.258k
use raise (16 frames)
                         50.079k (±10.1%) i/s -    251.045k

Comparison:
use caller (16 frames):    52927.3 i/s
use raise (16 frames):    50078.6 i/s - 1.06x slower

Calculating -------------------------------------
use caller (56 frames)
                         2.145k i/100ms
use raise (56 frames)
                         2.065k i/100ms
-------------------------------------------------
use caller (56 frames)
                         22.282k (± 9.3%) i/s -    111.540k
use raise (56 frames)
                         21.428k (± 9.9%) i/s -    107.380k

Comparison:
use caller (56 frames):    22281.5 i/s
use raise (56 frames):    21428.1 i/s - 1.04x slower

Calculating -------------------------------------
use caller (106 frames)
                         1.284k i/100ms
use raise (106 frames)
                         1.253k i/100ms
-------------------------------------------------
use caller (106 frames)
                         12.437k (±10.6%) i/s -     62.916k
use raise (106 frames)
                         10.873k (±12.6%) i/s -     53.879k

Comparison:
use caller (106 frames):    12437.4 i/s
use raise (106 frames):    10873.2 i/s - 1.14x slower