tools/benchmark-aod.R

devtools::load_all()

# --- Données réalistes ---

generer_donnees <- function(n) {
  caisses_possibles <- c(NA, "CNAVPL", "SRE", "CNRACL", "Regime special",
                          "MSA exploitant", "Agirc-Arrco", "Ircantec")
  categories_par_caisse <- list(
    "NA"              = c(NA, "invalide", "inapte"),
    "CNAVPL"          = c(NA, "inapte"),
    "SRE"             = c("actif", "sedentaire", "superactif"),
    "CNRACL"          = c("actif", "sedentaire", "superactif"),
    "Regime special"  = c("actif", "sedentaire", "superactif"),
    "MSA exploitant"  = NA_character_,
    "Agirc-Arrco"     = NA_character_,
    "Ircantec"        = NA_character_
  )

  caisse <- sample(caisses_possibles, n, replace = TRUE)
  categorie <- vapply(caisse, function(c) {
    key <- if(is.na(c)) "NA" else c
    cats <- categories_par_caisse[[key]]
    sample(cats, 1)
  }, character(1), USE.NAMES = FALSE)
  dateNaissance <- as.Date(paste0(sample(1940:2000, n, replace = TRUE), "-01-01"))
  dateLiq <- dateNaissance + sample(57:70, n, replace = TRUE) * 365.25

  list(
    dateNaissance = dateNaissance,
    dateLiq       = as.Date(dateLiq),
    caisse        = caisse,
    categorie     = categorie
  )
}

# --- Lookup mémoïsé ---
# On mémoïse aod_lookup et on vide le cache à chaque itération
# pour mesurer le coût "froid" (réaliste : une seule exécution par session)

aod_lookup_memo <- memoise::memoise(aod_lookup)

# --- Benchmark ---

sizes <- as.integer(10^(1:6))

res <- bench::press(
  n = sizes,
  {
    d <- generer_donnees(n)

    bench::mark(
      standard = aod_lookup(d$dateNaissance, d$dateLiq, d$caisse, d$categorie),
      dedup    = aod_lookup_dedup(d$dateNaissance, d$dateLiq, d$caisse, d$categorie),
      memo_froid = {
        memoise::forget(aod_lookup_memo)
        aod_lookup_memo(d$dateNaissance, d$dateLiq, d$caisse, d$categorie)
      },
      memo_chaud = aod_lookup_memo(d$dateNaissance, d$dateLiq, d$caisse, d$categorie),
      iterations = 5,
      check = FALSE,
      min_time = 0.05
    )
  }
)

cat("\n=== Résultats ===\n")
print(res[, c("expression", "n", "median", "mem_alloc")], n = Inf)

cat("\n=== Nb combinaisons uniques pour chaque n ===\n")
for(n in sizes) {
  d <- generer_donnees(n)
  nu <- nrow(unique(data.table(d$dateNaissance, d$dateLiq, d$caisse, d$categorie)))
  cat(sprintf("n = %7d → %d uniques\n", n, nu))
}

Try the legiretraite package in your browser

Any scripts or data that you put into this service are public.

legiretraite documentation built on Oct. 7, 2026, 5:09 p.m.