ThinkR-open / ThinkR-open/datadiff

[perf] Chemin local : les mêmes booléens sont balayés 2-3 fois et l'égalité recalculée jusqu'à 4 fois par comparaison

Open
#21 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
R
Stars
6
Forks
0
PR merge metrics
No merged PRs in 30d

Description

Contexte

Dans compare_datasets_from_yaml(), trois fonctions parcourent les mêmes vecteurs avec une sémantique strictement identique (mêmes accesseurs tol_col_bool/eq_col_bool) :

  • all_validations_pass() (fast_path.R) — verdict, court-circuit ;
  • build_coverage() (coverage.R) — toujours exécutée, balayage complet ;
  • failing_columns() (fast_path.R) — chemin d'échec, balayage complet.

Soit 2 balayages complets en cas vert, ~3 en cas rouge (+ l'interrogation pointblank). Aggravant : pour les colonnes d'égalité locales, le booléen n'est jamais matérialisé — eq_col_bool() recalcule cand == ref + is.na + ifelse à chaque passe (2× en vert, 3-4× en rouge avec le step col_vals_equal qui refait la comparaison). Mesuré : ~0,0025 s/recalcul sur 200 k lignes → ~1,5 s de pur recalcul redondant sur un cas vert 300 colonnes × 200 k. Par ailleurs ifelse(is.na(x), na_equal, x) est ~4× plus lent que l'équivalent x | (is.na(x) & na_equal).

Constat convergent de 3 analyses indépendantes (fast_path, coverage, perf transverse).

Reprex (bench)

library(datadiff)
n <- 2e5; p <- 300
ref  <- as.data.frame(setNames(replicate(p, rnorm(n), simplify = FALSE), paste0("c", 1:p)))
ref$id <- seq_len(n); cand <- ref
system.time(compare_datasets_from_yaml(ref, cand, key = "id"))
# profvis : all_validations_pass + build_coverage balayent chacun les mêmes booléens

Critères de succès

  • Une seule passe sur les données : build_coverage() calculée d'abord, puis all_passed_fast <- all(coverage$n_failed == 0L) et failing_columns dérivés de la coverage (n_failed > 0) — plus aucun appel direct à all_validations_pass/failing_columns sur les données.
  • Booléen d'égalité local calculé une fois par colonne (mémoïsé ou matérialisé en __eq comme le fait déjà le lazy) et remplacement d'ifelse par l'idiome vectorisé.
  • Verdicts strictement inchangés (test-equivalence-guard.R et suite complète verts).
  • Gain mesuré sur le bench dev/bench (cas vert RAM) documenté dans NEWS.

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start at compare_datasets_from_yaml() and trace the related paths in fast_path.R and coverage.R, then run the reprex benchmark. Use test-equivalence-guard.R and the full test suite to verify unchanged verdicts; done includes a documented dev/bench gain and a NEWS entry.

Written by the indexing model from the issue text.

Assessment

Tech stack
r
Domain
data, performance
Issue type
Refactor
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Clearly specified
Newbie friendliness
55/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.