lin
2025-06-05 ed3dd9d3e7519a82bb871d5eedb24a2fa0c91f47
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
// Copyright 2013 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
 
// The file contains tests that cannot run under race detector for some reason.
// +build !race
 
package runtime_test
 
import (
   "runtime"
   "testing"
)
 
// Syscall tests split stack between Entersyscall and Exitsyscall under race detector.
func BenchmarkSyscall(b *testing.B) {
   benchmarkSyscall(b, 0, 1)
}
 
func BenchmarkSyscallWork(b *testing.B) {
   benchmarkSyscall(b, 100, 1)
}
 
func BenchmarkSyscallExcess(b *testing.B) {
   benchmarkSyscall(b, 0, 4)
}
 
func BenchmarkSyscallExcessWork(b *testing.B) {
   benchmarkSyscall(b, 100, 4)
}
 
func benchmarkSyscall(b *testing.B, work, excess int) {
   b.SetParallelism(excess)
   b.RunParallel(func(pb *testing.PB) {
       foo := 42
       for pb.Next() {
           runtime.Entersyscall()
           for i := 0; i < work; i++ {
               foo *= 2
               foo /= 2
           }
           runtime.Exitsyscall()
       }
       _ = foo
   })
}