Skip to content

[perf] compute_tolerance_ok : bascule sur le kernel complet (~12x plus lent) dès le premier NA — un fast-path intermédiaire suffit #23

Description

@VincentGuyader

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

  • Fast-path de 2e niveau : colonnes avec NA mais sans NaN/Inf traitées sans le kernel complet ; garde basée sur any(is.nan(.))/any(is.infinite(.)) plutôt que anyNA seul.
  • Équivalence bit-à-bit avec compute_tolerance_col()$ok verrouillée par test (NA, NaN, Inf, mixtes, na_equal TRUE/FALSE) — extension de test-tolerance-ok.R.
  • Nettoyage des masques redondants du kernel complet (both_nan/one_nan inclus dans both_na/one_na) sans changement de résultat.
  • Gain mesuré sur le scénario lyon-na du bench documenté dans NEWS.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions