Skip to content

Perf/compression plages et filtrage - #40

Merged
fwininger merged 3 commits into
mainfrom
perf/compression-plages-et-filtrage
Sep 7, 2026
Merged

Perf/compression plages et filtrage#40
fwininger merged 3 commits into
mainfrom
perf/compression-plages-et-filtrage

Conversation

@fwininger

Copy link
Copy Markdown
Member

No description provided.

fwininger-cbw and others added 3 commits September 7, 2026 16:48
Les fichiers de hash listaient chaque version pour chaque hash, ce qui est
très redondant : un fichier statique inchangé pendant 200 versions répétait
ces 200 chaînes.

Le format v2 stocke la liste ordonnée des versions dans `_meta.sorted_versions`
et remplace les listes par des plages inclusives ("4.5-4.5.23") sous la clé
`files`. Une plage n'est émise que pour des versions adjacentes dans
`sorted_versions`, donc l'expansion ne peut pas inventer une version qui
n'a pas été observée.

Ajoute `version_utils` pour le tri des versions et la compression/expansion
des plages. Le tri gère les schémas de tag des projets suivis : préfixe v,
préversions (alpha < beta < rc < release), patch levels Magento (-p1),
underscores Joomla (2.5.0_RC1) et versions à quatre segments. Les segments
numériques sont comparés en entiers, donc 2.0.10 vient après 2.0.2.

Sur le jeu de technologies actuel : 190 Mo -> 40 Mo (-79 % brut, -20 % après
gzip), au prix d'une expansion au chargement (magento2 : 0,12 s -> 0,50 s).

`load_json` continue de lire l'ancien format (absence de `_meta`), ce qui
préserve les mises à jour incrémentales à partir d'une release existante.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
La plupart des fichiers statiques ne changent pas pendant une longue série de
releases : leur hash ne permet pas de distinguer une version. Ils occupent
pourtant l'essentiel de la base.

Chaque fichier reçoit un score :

    score = nombre de hashs distincts / taille du plus grand groupe de versions

Un fichier avec beaucoup de hashs et de petits groupes est discriminant ; un
fichier dont un hash unique couvre 200 versions ne l'est pas (score 0,005).
Les fichiers sous `--discrimination-threshold` sont retirés avant l'écriture
(défaut 0,05 ; 0 pour désactiver).

Mesuré sur le jeu de technologies actuel : 25 à 54 % des fichiers et 23 % de
la taille totale en moins, et seules deux versions toutes technologies
confondues (drupal 8.1.0-rc1 et wordpress 5.4.1) perdent la détection exacte.
Aucune version ne perd toute couverture, et il reste des milliers de fichiers
candidats par technologie.

Le seuil de 0,05 a été retenu plutôt que 0,1 : ce dernier retire jusqu'à 70 %
des fichiers pour deux versions détectables en moins.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
La section "Output format" décrivait encore la table plate
{ file_path: { sha1: [versions] } } et `--discrimination-threshold`
n'apparaissait pas dans les options.

Documente la structure v2 (`_meta.sorted_versions` + `files`), la règle
d'adjacence des plages, les schémas de version gérés par le tri, et comment
un consommateur doit expandre les plages avant de comparer. Ajoute une section
sur le score de discrimination et son seuil.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@fwininger
fwininger merged commit f705bb2 into main Sep 7, 2026
8 of 10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants