github.com/consensys/gnark@v0.11.0/profile/profile_test.go (about) 1 //go:build !windows 2 3 package profile_test 4 5 import ( 6 "fmt" 7 8 "github.com/consensys/gnark-crypto/ecc" 9 "github.com/consensys/gnark/frontend" 10 "github.com/consensys/gnark/frontend/cs/r1cs" 11 "github.com/consensys/gnark/profile" 12 ) 13 14 type Circuit struct { 15 A frontend.Variable 16 } 17 18 type obj struct { 19 } 20 21 func (circuit *Circuit) Define(api frontend.API) error { 22 var o obj 23 o.Define(api, circuit.A) 24 // api.AssertIsEqual(api.Mul(circuit.A, circuit.A), circuit.A) 25 return nil 26 } 27 28 func (o *obj) Define(api frontend.API, A frontend.Variable) error { 29 api.AssertIsEqual(api.Mul(A, A), A) 30 return nil 31 } 32 33 func Example() { 34 // default options generate gnark.pprof in current dir 35 // use pprof as usual (go tool pprof -http=:8080 gnark.pprof) to read the profile file 36 // overlapping profiles are allowed (define profiles inside Define or subfunction to profile 37 // part of the circuit only) 38 p := profile.Start() 39 _, _ = frontend.Compile(ecc.BN254.ScalarField(), r1cs.NewBuilder, &Circuit{}) 40 p.Stop() 41 42 // expected output fmt.Println(p.Top()) 43 const _ = `Showing nodes accounting for 2, 100% of 2 total 44 ----------------------------------------------------------+------------- 45 flat flat% sum% cum cum% calls calls% + context 46 ----------------------------------------------------------+------------- 47 1 100% | profile_test.(*Circuit).Define profile/profile_test.go:21 48 1 50.00% 50.00% 1 50.00% | r1cs.(*builder).AssertIsEqual frontend/cs/r1cs/api_assertions.go:37 49 ----------------------------------------------------------+------------- 50 1 100% | profile_test.(*Circuit).Define profile/profile_test.go:21 51 1 50.00% 100% 1 50.00% | r1cs.(*builder).Mul frontend/cs/r1cs/api.go:221 52 ----------------------------------------------------------+------------- 53 0 0% 100% 2 100% | profile_test.(*Circuit).Define profile/profile_test.go:21 54 1 50.00% | r1cs.(*builder).AssertIsEqual frontend/cs/r1cs/api_assertions.go:37 55 1 50.00% | r1cs.(*builder).Mul frontend/cs/r1cs/api.go:221 56 ----------------------------------------------------------+-------------` 57 58 fmt.Println(p.NbConstraints()) 59 // Output: 60 // 2 61 }