Bienvenue ! Quel est votre objectif aujourd'hui ?

Sélectionnez votre profil pour adapter l'arborescence et accéder directement aux contenus pertinents.

Freelance & Tech

Je suis un recruteur / Tech Lead

Vous cherchez un développeur freelance Senior Go / Fullstack, un renfort d'équipe ou une expertise d'architecture.

Voir le profil Recruteur →
Studio & Logiciel

Je souhaite construire mon logiciel

Vous avez un besoin métier sur-mesure, une application web/mobile à concevoir ou un MVP à concrétiser.

Voir le profil Sur-Mesure →
Courses/Performance For Backend/Slots/J1_am

Modalités d'Évaluation & Sujets Libres

Livrable Final & Choix du Projet (RNCP Bloc 4)

Le projet d'optimisation est construit tout au long des 4 jours. Vous pouvez soit choisir un sujet libre, soit choisir l'une des 10 suggestions de projets (WorldGen, Sudoku, RayTracer, Bot d'Échecs, Jeu de la Vie, Order Book HFT, PixelWar, SIEM Détection, Mini-Vector DB, Spatial Game Server) soumises à la même grille d'évaluation technique.

1 Projet Libre

Au choix : La seule contrainte est de pouvoir appliquer optimisations & benchmarks au fur et à mesure du cours.

2 Sujets Libres

10 alternatives (Fintech, Rendu 3D, Moteur d'échecs, IA Vectorielle) avec mêmes critères d'optimisation.

3 Livrables

Code source versionné, mesures de temps avant/après, profils d'exécution et rapport d'audit comparatif.


1. Définition & Ressources Critiques

Définition Fondamentale

La performance est la capacité d'un système à accomplir une charge de travail donnée en minimisant le temps d'exécution et l'empreinte sur les ressources matérielles.

1 Temps & Latence

Cycles CPU consommés, temps d'attente et blocages (I/O, locks, synchronisation).

2 Mémoire Vive

Allocations dynamiques (Tas/Heap), pression sur le Garbage Collector et localité des caches.

3 I/O & Réseau

Bande passante, saturation des sockets ouvertes et surcoût de sérialisation.

4 Énergie & Infra

Dimensionnement serveur, facture Cloud et empreinte carbone de l'infrastructure.

  • Fiabilité & SLA : Garantir des temps de réponse prédictibles sous forte charge.
  • Scalabilité & Coûts : Absorber 10× plus de trafic sans multiplier les serveurs par 10.
  • Sobriété Numérique : Optimiser l'efficacité du code avant d'empiler du matériel.

2. Règle d'Or du Développement

Étape 1
Make it work

Exactitude d'abord. Valider le besoin métier. Un code ultra-rapide qui produit un résultat faux est inutile.

Étape 2
Make it right

Architecture lisible. Code testé, propre et modulaire. Ne jamais optimiser sur une base instable ou confuse.

Étape 3
Make it fast

Optimiser après mesure. Cibler uniquement les goulots d'étranglement prouvés, sans complexité prématurée.

  • Loi absolue : Ne jamais inverser l'ordre ! L'optimisation prématurée est la première cause de complexité accidentelle.

3. Macro vs Micro-Optimisation

Macro-optimisation (Échelle globale)

Impact structurel sur l'architecture, la complexité formelle et les flux :
Algorithmes : Réduire la complexité formelle (O(n²)O(n log n)).
Structures de données : Tableaux contigus vs listes chaînées, tables de hachage.
Architecture système : Asynchronisme, streaming, distribution de charge et caches.

Micro-optimisation (Échelle locale)

Exploitation fine du matériel ciblée sur les chemins critiques (Hot Paths) :
Primitives bas niveau : Utiliser des fonctions vectorisées (ex: copy() en Go).
Chasse aux copies : Élimination des allocations temporaires et passages par référence.
Aide au compilateur : Inlining automatique et déroulement de boucles.


4. Notation Grand O & Complexité Asymptotique

La notation Grand O (O(...)) quantifie l'évolution du nombre d'opérations et de cycles consommés quand la taille des données N augmente :

Inspecteur Graphique de Complexité
Préréglages :
Taille des données (N) : N = 50
O(1) Constant
1op

Accès direct indexé, hash map idéale

O(log N) Logarithmique
6ops

Dichotomie, index d'arbre B-Tree SQL

O(N) Linéaire
50ops

Parcours complet de slice, Table Scan

O(N log N) Quasi-linéaire
282ops

Tris optimaux (MergeSort, QuickSort)

O(N²) Quadratique
2 500ops

Boucles imbriquées naïves, jointure produit


5. Compromis Espace-Temps (RAM/CPU)

Le compromis fondamental (Space-Time Trade-off) : choisir entre dépenser des cycles CPU ou occuper des octets en mémoire :

1. Économiser le CPU (+ RAM) - CPU / + RAM

Mémoïsation & Caching : Mettre en cache les résultats de calculs récurrents.
Dénormalisation : Dupliquer l'information pour éviter des jointures coûteuses.
Tables de correspondance : Remplacer des calculs par une lecture indexée directe.

2. Économiser la Mémoire (+ CPU) - RAM / + CPU

Compression à la volée : Dépenser du CPU (gzip, zstd) pour soulager la RAM et le réseau.
Streaming par blocs : Traiter au fil de l'eau avec un buffer constant minimal.

La Limite Matérielle Moderne

Surconsommer de la RAM engendre des défauts de cache CPU (Cache Misses) et sature le Garbage Collector : l'excès de mémoire finit par dégrader aussi le CPU !


6. Goulots d'Étranglement & Loi d'Amdahl

La vitesse globale d'un système est dictée par son maillon le plus lent. La loi d'Amdahl borne mathématiquement l'accélération maximale atteignable :

Sglobal =
1 (1 - P) + (P / S)
P : Fraction optimisable ou parallélisable du temps global.
S : Facteur d'accélération obtenu sur cette fraction isolée.
I/O & Réseau

Latence réseau, APIs tierces et sockets bloquantes.

Base de Données

Requêtes N+1, tables non indexées et saturation du pool.

Concurrence

Contention sur verrous partagés et files bloquantes.

Calcul CPU

Parsing lourd, allocations continues et boucles critiques.

  • Loi du maillon faible : Si une portion ne pèse que 5% du temps total d'une requête, l'optimiser n'apportera jamais plus de 5% de gain global, même avec une accélération infinie (S → ∞).
  • Règle scientifique : Toujours profiler avant d'optimiser pour cibler mathématiquement le goulot prédominant.

7. Le Hot Path : Chemin Critique

Dans tout service backend, le code se divise en deux réalités mécaniques distinctes :

Cold Path (90% du Code) Lisibilité & Clarté

Démarrage, injection de dépendances, chargement de configuration, gestion des erreurs rares.
Principe : Privilégier la maintenabilité. Optimiser ici ne produit aucun gain mesurable.

Hot Path (10% du Code) Efficience & Zéro Copie

Boucles d'ingestion, parsing réseau, logique métier exécutée des millions de fois sous charge.
Principe : Zéro allocation sur le tas, zéro copie inutile, inlining maximal.

  • Règle fondamentale : On ne devine jamais le Hot Path, on le mesure avec un profileur (Flamegraph, pprof).

Données & Représentation Binaire

Partie 2

Des signaux électriques aux encodages textuels universels (ASCII • UTF-8).


8. Transistors & Signal Binaire

À l'échelle physique élémentaire, un processeur fonctionne par modulation de tensions électriques :

1. Tension Électrique Potentiel électrique (~0 V ou ~1 V). Signal physique
2. Transistor Silicium Interrupteur microscopique (gravure 3 à 7 nm). Passant / Bloqué
3. État Binaire (Bit) Information logique élémentaire : 0 ou 1. 0 / 1
  • Pourquoi le binaire ? Deux états de tension distincts éliminent les erreurs de lecture causées par le bruit électrique.
  • Un CPU moderne regroupe des milliards de transistors sur quelques millimètres carrés de silicium.

9. Bits, Octets & Puissances

Toutes les structures de données en mémoire sont des combinaisons d'octets :

  • 1 Bit : Unité élémentaire d'information (état logique 0 ou 1).
  • 1 Octet (Byte) : Groupement ordonné de 8 bits contigus.
  • Poids binaires (Puissances de 2) :
    • Chaque bit vers la gauche double en valeur : 1 · 2 · 4 · 8 · 16 · 32 · 64 · 128.
    • Valeur maximale non signée : 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255 (256 combinaisons de 0 à 255).
b7 128
b6 64
b5 32
b4 16
b3 8
b2 4
b1 2
b0 1

10. Simulateur Binaire Interactif

Activez les bits pour observer l'interprétation numérique et textuelle en direct :

Inspecteur d'Octet 8-Bit
Non signé (uint8) 65
Signé (int8) +65
Hexadécimal 0x41
Caractère 'A' (ASCII)
Préréglages :

11. Encodage Texte : ASCII & UTF-8

Table ASCII 1 Octet Fixe (7 bits)

Valeurs de 0 à 127 pour l'alphabet latin de base, les chiffres et caractères de contrôle.

'A' 65 · 0x41
'0' 48 · 0x30
'\n' 10 · 0x0A
Standard UTF-8 1 à 4 Octets Variables

Rétrocompatible ASCII sur 1 octet, et dimension dynamique pour l'ensemble des caractères mondiaux :

'A' 1 octet
0x41
'é' 2 octets
0xC3 0xA9
'€' 3 octets
0xE2 0x82 0xAC
𝄢 4 octets
0xF0 0x9D 0x84 0xA2

12. Piège Mémoire des Chaînes

Différence cruciale entre octets physiques en mémoire et caractères logiques (glyphes) :

Le Piège d'Indexation par Octet

En mémoire, une chaîne est un tableau d'octets immuable.
len("Go") == 2 octets / 2 caractères.
len("Café") == 5 octets pour seulement 4 caractères ('é' pèse 2 octets en UTF-8).

  • Danger d'intégrité : Accéder à s[3] dans "Café" extrait le premier demi-octet isolé (0xC3) et corrompt la donnée.
  • Règle backend : Toujours itérer sur les points de code décodés (ex: runes en Go, .chars() en Rust) plutôt que d'indexer les octets bruts.

TP Fil Rouge (Séance 1) : Mise en Place & Craqueur Naïf (Baseline)

Activité Pratique • 3h30 • Objectif Mise en Place & Baseline

Mission : Initialiser votre projet dans le langage de votre choix, coder l'algorithme combinatoire naïf pour résoudre z3D puis Sh3n, et noter votre temps d'exécution de référence.

1. Initialisation & Choix du Langage

Initialiser un nouveau projet dans le langage de votre choix (Go, Rust, C++, C#, Java, etc.) sur votre poste. Aucun template n'est imposé.

2. Algorithme Naïf (Compteur Base-N)

Coder le générateur combinatoire pour produire chaque mot candidat dans l'alphabet choisi et calculer son condensat SHA-256.

3. Résolution des Cibles (z3D & Sh3n)

Valider que le programme découvre avec succès le mot de passe en clair pour la cible Niveau 1 (z3D) puis Niveau 2 (Sh3n).

4. Chronométrage & Baseline Initiale

Mesurer le temps d'exécution initial (chronométrage simple) et consigner ce temps de référence (Baseline) pour comparer les futurs gains.