github.com/consensys/gnark@v0.11.0/internal/stats/generate/main.go (about) 1 package main 2 3 import ( 4 "flag" 5 "fmt" 6 "log" 7 "regexp" 8 "sync" 9 10 "github.com/consensys/gnark/backend" 11 "github.com/consensys/gnark/internal/stats" 12 ) 13 14 var ( 15 fSave = flag.Bool("s", false, "save new stats in file ") 16 fFilter = flag.String("run", "", "filter runs with regexp; example 'pairing*'") 17 ) 18 19 func main() { 20 flag.Parse() 21 22 var r *regexp.Regexp 23 if *fFilter != "" { 24 r = regexp.MustCompile(*fFilter) 25 } 26 27 s := stats.NewGlobalStats() 28 29 // load reference objects 30 // for each circuit, on each curve, on each backend 31 // compare with reference stats 32 snippets := stats.GetSnippets() 33 var wg sync.WaitGroup 34 for name, c := range snippets { 35 if r != nil && !r.MatchString(name) { 36 continue 37 } 38 wg.Add(1) 39 go func(name string, circuit stats.Circuit) { 40 defer wg.Done() 41 for _, curve := range circuit.Curves { 42 for _, backendID := range backend.Implemented() { 43 cs, err := stats.NewSnippetStats(curve, backendID, circuit.Circuit) 44 if err != nil { 45 log.Fatalf("building stats for circuit %s %v", name, err) 46 } 47 s.Add(curve, backendID, cs, name) 48 } 49 } 50 }(name, c) 51 } 52 wg.Wait() 53 54 fmt.Println("id,curve,backend,nbConstraints,nbWires") 55 for name, c := range snippets { 56 if r != nil && !r.MatchString(name) { 57 continue 58 } 59 ss := s.Stats[name] 60 for _, curve := range c.Curves { 61 for _, backendID := range backend.Implemented() { 62 cs := ss[backendID][stats.CurveIdx(curve)] 63 fmt.Printf("%s,%s,%s,%d,%d\n", name, curve, backendID, cs.NbConstraints, cs.NbInternalWires) 64 } 65 } 66 } 67 68 if *fSave { 69 const refPath = "../latest.stats" 70 if err := s.Save(refPath); err != nil { 71 log.Fatal(err) 72 } 73 log.Println("successfully saved new reference stats file", refPath) 74 } 75 76 }