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
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, puisall_passed_fast <- all(coverage$n_failed == 0L)etfailing_columnsdérivés de la coverage (n_failed > 0) — plus aucun appel direct àall_validations_pass/failing_columnssur les données. - Booléen d'égalité local calculé une fois par colonne (mémoïsé ou matérialisé en
__eqcomme le fait déjà le lazy) et remplacement d'ifelsepar 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
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- 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