@@ -11,13 +11,16 @@ import (
1111 "errors"
1212 "fmt"
1313 "log"
14+ "math"
1415 "os"
16+ "sort"
1517 "strings"
1618 "time"
1719
1820 "go.mongodb.org/mongo-driver/v2/bson"
1921 "go.mongodb.org/mongo-driver/v2/mongo"
2022 "go.mongodb.org/mongo-driver/v2/mongo/options"
23+ "gonum.org/v1/gonum/mat"
2124)
2225
2326type RawData struct {
@@ -51,6 +54,15 @@ type RawData struct {
5154 FailedRollupAttempts int64 `bson:"failed_rollup_attempts"`
5255}
5356
57+ type EnergyStats struct {
58+ Benchmark string
59+ PatchVersion string
60+ MainlineVersion string
61+ E float64
62+ T float64
63+ H float64
64+ }
65+
5466func main () {
5567 // Connect to analytics node
5668 uri := os .Getenv ("perf_uri_private_endpoint" )
@@ -98,7 +110,12 @@ func main() {
98110 log .Panicf ("Path and mainline data length do not match." )
99111 }
100112
101- // TODO: Calculate energy statistics
113+ // Calculate energy statistics
114+ energyStats , err := getEnergyStatsForAllBenchMarks (patchRawData , mainlineRawData )
115+ if err != nil {
116+ log .Panicf ("Error calculating energy stats: %v" , err )
117+ }
118+ fmt .Printf ("Successfully retrieved %d energy stats.\n " , len (energyStats ))
102119
103120 // Disconnect client
104121 err0 := client .Disconnect (context .Background ())
@@ -165,3 +182,57 @@ func parseMainelineCommits(rawData []RawData) ([]string, error) {
165182 }
166183 return commits , nil
167184}
185+
186+ func getEnergyStatsForOneBenchmark (xRaw RawData , yRaw RawData ) (* EnergyStats , error ) {
187+
188+ var x []float64
189+ var y []float64
190+ for _ , stat := range xRaw .Rollups .Stats {
191+ x = append (x , stat .Val )
192+ }
193+ for _ , stat := range yRaw .Rollups .Stats {
194+ y = append (y , stat .Val )
195+ }
196+
197+ for i := range (int )(math .Min ((float64 )(len (xRaw .Rollups .Stats )), float64 (len (yRaw .Rollups .Stats )))) {
198+ if xRaw .Rollups .Stats [i ].Name != yRaw .Rollups .Stats [i ].Name {
199+ return nil , errors .New ("measurements do not match" )
200+ }
201+ }
202+
203+ e , t , h := GetEnergyStatistics (mat .NewDense (len (x ), 1 , x ), mat .NewDense (len (y ), 1 , y ))
204+ return & EnergyStats {
205+ Benchmark : xRaw .Info .TestName ,
206+ PatchVersion : xRaw .Info .Version ,
207+ MainlineVersion : yRaw .Info .Version ,
208+ E : e ,
209+ T : t ,
210+ H : h ,
211+ }, nil
212+ }
213+
214+ func getEnergyStatsForAllBenchMarks (patchRawData []RawData , mainlineRawData []RawData ) ([]* EnergyStats , error ) {
215+
216+ sort .Slice (patchRawData , func (i , j int ) bool {
217+ return patchRawData [i ].Info .TestName < patchRawData [j ].Info .TestName
218+ })
219+ sort .Slice (mainlineRawData , func (i , j int ) bool {
220+ return mainlineRawData [i ].Info .TestName < mainlineRawData [j ].Info .TestName
221+ })
222+
223+ var energyStats []* EnergyStats
224+ for i := range patchRawData {
225+ if testname := patchRawData [i ].Info .TestName ; testname != mainlineRawData [i ].Info .TestName {
226+ return nil , errors .New ("tests do not match" )
227+ }
228+
229+ es , err := getEnergyStatsForOneBenchmark (patchRawData [i ], mainlineRawData [i ])
230+ if err != nil {
231+ return nil , err
232+ }
233+ energyStats = append (energyStats , es )
234+
235+ fmt .Printf ("%s | H-score: %.4f\n " , es .Benchmark , es .H )
236+ }
237+ return energyStats , nil
238+ }
0 commit comments