diff options
Diffstat (limited to 'src/runtime/panic_test.go')
| -rw-r--r-- | src/runtime/panic_test.go | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/src/runtime/panic_test.go b/src/runtime/panic_test.go index 2b06bce45d..5a4b6ae633 100644 --- a/src/runtime/panic_test.go +++ b/src/runtime/panic_test.go @@ -5,8 +5,10 @@ package runtime_test import ( + "slices" "strings" "testing" + "time" ) // Test that panics print out the underlying value @@ -48,3 +50,51 @@ func TestPanicWithDirectlyPrintableCustomTypes(t *testing.T) { }) } } + +func TestPanicRecoverSpeed(t *testing.T) { + // For issue 77062. + t.Skip("This test is too flaky at the moment. But it does normally pass. Suggestions for making it less flaky are welcome.") + + // Recursive function that does defer/recover/repanic. + var f func(int) + f = func(n int) { + if n == 0 { + panic("done") + } + defer func() { + err := recover() + panic(err) + }() + f(n - 1) + } + + time := func(f func()) time.Duration { + var times []time.Duration + for range 10 { + start := time.Now() + f() + times = append(times, time.Since(start)) + } + slices.Sort(times) + times = times[1 : len(times)-1] // skip high and low, to reduce noise + var avg time.Duration + for _, v := range times { + avg += v / time.Duration(len(times)) + } + return avg + } + + a := time(func() { + defer func() { recover() }() + f(1024) + }) + b := time(func() { + defer func() { recover() }() + f(2048) + }) + m := b.Seconds() / a.Seconds() + t.Logf("a: %v, b: %v, m: %v", a, b, m) + if m > 3.5 { + t.Errorf("more than 2x time increase: %v", m) + } +} |
