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  }