@@ -18,13 +18,12 @@ use std::{str, time::Instant};
18
18
use anyhow:: Context ;
19
19
use clap:: builder:: TypedValueParser ;
20
20
use clap:: { Arg , Parser } ;
21
+ use collector:: compare:: compare_artifacts;
21
22
use humansize:: { format_size, BINARY } ;
22
- use itertools:: Itertools ;
23
23
use rayon:: iter:: { IndexedParallelIterator , IntoParallelRefIterator , ParallelIterator } ;
24
24
use tabled:: builder:: Builder ;
25
25
use tabled:: settings:: object:: { Columns , Rows } ;
26
26
use tabled:: settings:: { Alignment , Border , Color , Modify } ;
27
- use tabled:: { Table , Tabled } ;
28
27
use tokio:: runtime:: Runtime ;
29
28
30
29
use collector:: api:: next_artifact:: NextArtifact ;
@@ -54,7 +53,7 @@ use collector::toolchain::{
54
53
use collector:: utils:: cachegrind:: cachegrind_diff;
55
54
use collector:: utils:: { is_installed, wait_for_future} ;
56
55
use collector:: { utils, CollectorCtx , CollectorStepBuilder } ;
57
- use database:: { ArtifactId , ArtifactIdNumber , Commit , CommitType , Connection , Lookup , Pool } ;
56
+ use database:: { ArtifactId , ArtifactIdNumber , Commit , CommitType , Connection , Pool } ;
58
57
59
58
fn n_normal_benchmarks_remaining ( n : usize ) -> String {
60
59
let suffix = if n == 1 { "" } else { "s" } ;
@@ -637,10 +636,10 @@ enum Commands {
637
636
db : DbOption ,
638
637
639
638
#[ arg( long) ]
640
- a_id : String ,
639
+ base : String ,
641
640
642
641
#[ arg( long) ]
643
- b_id : String ,
642
+ modified : String ,
644
643
} ,
645
644
}
646
645
@@ -1201,111 +1200,11 @@ Make sure to modify `{dir}/perf-config.json` if the category/artifact don't matc
1201
1200
println ! ( "Data of artifact {name} were removed" ) ;
1202
1201
Ok ( 0 )
1203
1202
}
1204
- Commands :: BenchLocalDiff { db, a_id , b_id } => {
1203
+ Commands :: BenchLocalDiff { db, base , modified } => {
1205
1204
let pool = Pool :: open ( & db. db ) ;
1206
1205
let rt = build_async_runtime ( ) ;
1207
- let mut conn = rt. block_on ( pool. connection ( ) ) ;
1208
- let index = rt. block_on ( database:: Index :: load ( & mut * conn) ) ;
1209
-
1210
- let sids = index
1211
- . compile_statistic_descriptions ( )
1212
- . map ( |( _, sid) | sid)
1213
- . collect :: < Vec < _ > > ( ) ;
1214
-
1215
- let a_id_number = rt
1216
- . block_on ( conn. artifact_by_name ( & a_id) )
1217
- . expect ( "Cannot find specified artifact" )
1218
- . lookup ( & index)
1219
- . unwrap ( ) ;
1220
- let b_id_number = rt
1221
- . block_on ( conn. artifact_by_name ( & b_id) )
1222
- . expect ( "Cannot find specified artifact" )
1223
- . lookup ( & index)
1224
- . unwrap ( ) ;
1225
-
1226
- let pstats =
1227
- rt. block_on ( conn. get_pstats ( & sids, & [ Some ( a_id_number) , Some ( b_id_number) ] ) ) ;
1228
- let tuple_pstats = pstats
1229
- . into_iter ( )
1230
- . map ( |row| row. into_iter ( ) . collect_tuple :: < ( _ , _ ) > ( ) . unwrap ( ) )
1231
- . collect :: < Vec < ( Option < f64 > , Option < f64 > ) > > ( ) ;
1232
-
1233
- #[ derive( Tabled ) ]
1234
- struct Regression {
1235
- count : usize ,
1236
- #[ tabled( display_with = "display_range" ) ]
1237
- range : ( f64 , f64 ) ,
1238
- #[ tabled( display_with = "display_mean" ) ]
1239
- mean : f64 ,
1240
- }
1241
-
1242
- fn display_range ( value : & ( f64 , f64 ) ) -> String {
1243
- format ! ( "[{:+.2}%, {:+.2}%]" , value. 0 , value. 1 )
1244
- }
1245
-
1246
- fn display_mean ( value : & f64 ) -> String {
1247
- format ! ( "{:+.2}%" , value)
1248
- }
1249
-
1250
- impl From < & Vec < f64 > > for Regression {
1251
- fn from ( value : & Vec < f64 > ) -> Self {
1252
- let min = * value. iter ( ) . min_by ( |a, b| a. total_cmp ( b) ) . unwrap ( ) ;
1253
- let max = * value. iter ( ) . max_by ( |a, b| a. total_cmp ( b) ) . unwrap ( ) ;
1254
- let count = value. len ( ) ;
1255
-
1256
- Regression {
1257
- range : ( min, max) ,
1258
- count,
1259
- mean : ( value. iter ( ) . sum :: < f64 > ( ) / count as f64 ) ,
1260
- }
1261
- }
1262
- }
1263
-
1264
- const DEFAULT_SIGNIFICANCE_THRESHOLD : f64 = 0.002 ;
1265
- let change = tuple_pstats
1266
- . iter ( )
1267
- . filter_map ( |& ( a, b) | match ( a, b) {
1268
- ( Some ( a) , Some ( b) ) => {
1269
- if a == 0.0 {
1270
- None
1271
- } else {
1272
- Some ( ( b - a) / a)
1273
- }
1274
- }
1275
- ( _, _) => None ,
1276
- } )
1277
- . filter ( |c| c. abs ( ) >= DEFAULT_SIGNIFICANCE_THRESHOLD * 100.0 )
1278
- . collect :: < Vec < _ > > ( ) ;
1279
- let negative_change = change
1280
- . iter ( )
1281
- . copied ( )
1282
- . filter ( |& c| c < 0.0 )
1283
- . collect :: < Vec < _ > > ( ) ;
1284
- let positive_change = change
1285
- . iter ( )
1286
- . copied ( )
1287
- . filter ( |& c| c > 0.0 )
1288
- . collect :: < Vec < _ > > ( ) ;
1289
-
1290
- #[ derive( Tabled ) ]
1291
- struct NamedRegression {
1292
- name : String ,
1293
- #[ tabled( inline) ]
1294
- regression : Regression ,
1295
- }
1296
-
1297
- let regressions = [ negative_change, positive_change, change]
1298
- . into_iter ( )
1299
- . map ( |c| Regression :: from ( & c) )
1300
- . zip ( [ "❌" , "✅" , "✅, ❌" ] )
1301
- . map ( |( c, label) | NamedRegression {
1302
- name : label. to_string ( ) ,
1303
- regression : c,
1304
- } )
1305
- . collect :: < Vec < _ > > ( ) ;
1306
-
1307
- println ! ( "{}" , Table :: new( regressions) ) ;
1308
-
1206
+ let conn = rt. block_on ( pool. connection ( ) ) ;
1207
+ rt. block_on ( compare_artifacts ( conn, base, modified) ) ;
1309
1208
Ok ( 0 )
1310
1209
}
1311
1210
}
0 commit comments