Contexte
compute_tolerance_ok() (R/tolerance.R) a un fast-path (3 passes) réservé aux colonnes sans aucun NA/NaN/Inf. Dès qu'une colonne contient un seul NA — le cas le plus courant en données réelles (bench lyon-na de dev/bench/perf_issue4.R) — elle bascule sur le kernel complet compute_tolerance_col() et ses ~15 passes vectorielles (7 masques dont certains redondants : both_nan ⊂ both_na en R).
Mesures (200 k lignes, R 4.3.3) :
- kernel complet : 0,0175 s/colonne — 11,7× le fast-path (0,0015 s) ;
- kernel intermédiaire « NA sans NaN/Inf » (ok brut +
ok[is.na(ok)] <- FALSE + correction both_na) : 0,004 s — 4,4× plus rapide que le complet, résultat bit-identique (vérifié).
Extrapolé au bench lyon-na (500 col × 300 k) : ~13 s → ~3 s sur ce poste.
Reprex (bench)
n <- 2e5
ref <- rnorm(n); cand <- ref + 1e-12
cand[sample(n, 100)] <- NA # 0,05 % de NA suffisent à payer 12x
bench::mark(
fast = datadiff:::compute_tolerance_ok(ref, ref, 1e-9, 0, TRUE), # sans NA
complet = datadiff:::compute_tolerance_ok(cand, ref, 1e-9, 0, TRUE), # avec NA
check = FALSE
)
Critères de succès
Contexte
compute_tolerance_ok()(R/tolerance.R) a un fast-path (3 passes) réservé aux colonnes sans aucun NA/NaN/Inf. Dès qu'une colonne contient un seul NA — le cas le plus courant en données réelles (benchlyon-nade dev/bench/perf_issue4.R) — elle bascule sur le kernel completcompute_tolerance_col()et ses ~15 passes vectorielles (7 masques dont certains redondants :both_nan ⊂ both_naen R).Mesures (200 k lignes, R 4.3.3) :
ok[is.na(ok)] <- FALSE+ correctionboth_na) : 0,004 s — 4,4× plus rapide que le complet, résultat bit-identique (vérifié).Extrapolé au bench lyon-na (500 col × 300 k) : ~13 s → ~3 s sur ce poste.
Reprex (bench)
Critères de succès
any(is.nan(.))/any(is.infinite(.))plutôt queanyNAseul.compute_tolerance_col()$okverrouillée par test (NA, NaN, Inf, mixtes,na_equalTRUE/FALSE) — extension de test-tolerance-ok.R.both_nan/one_naninclus dansboth_na/one_na) sans changement de résultat.