Performances serveur
Performances côté serveur de Giggr : nombre de requêtes SQL, temps de traitement et absence de N+1 grâce à l’eager loading, relevés via Laravel Debugbar.
Requêtes et temps par page
Pour chaque page clé, relevé du nombre de requêtes SQL, du temps de
traitement serveur et de la mémoire, lus dans
Laravel Debugbar (le seul profileur embarqué dans Giggr).
Mesures faites en local (artisan serve),
avec données de démonstration ; Debugbar ajoute un léger surcoût mais les
ordres de grandeur sont représentatifs.
| Page | URL | Requêtes | Temps serveur | Mémoire |
|---|---|---|---|---|
| Accueil | / | 12 | 58 ms | 4 Mo |
| Explorer (profils) | /explorer/profils | 15 | 59 ms | 4 Mo |
| Explorer (annonces) | /explorer/annonces | 15 | 51 ms | 3 Mo |
| Profil public | /profil/{id} | 3 | 13 ms | 2 Mo |
| Détail d’une annonce | /annonces/{id} | 3 | 12 ms | 2 Mo |
| Contact | /contact | 2 | 29 ms | 2 Mo |
| Confidentialité | /politique-de-confidentialite | 2 | 31 ms | 2 Mo |
Le contraste est parlant : une grille d’exploration entière (douze cartes avec leurs musiciens, villes, instruments et genres) tient en 15 requêtes, et la fiche d’un profil ou d’une annonce en 3. Les pages statiques (contact, confidentialité) descendent à 2, dont la session.
Problèmes N+1 maîtrisés
Un problème N+1 survient quand une requête principale en déclenche une supplémentaire par enregistrement lié : par exemple une requête par profil pour aller chercher sa ville, ses instruments ou ses genres. Sur la grille d’exploration (douze profils), ce serait douze requêtes de base, plus quatre par profil, soit une soixantaine.
Giggr l’évite avec l’eager loading d’Eloquent : un seul
with() précharge toutes les
relations affichées, qui sont alors récupérées en un nombre fixe de
requêtes groupées (where ... in (...)),
indépendant du nombre de cartes.
// pages/explore : un seul with() précharge les relations affichées
return Profile::query()
->with(['user', 'city', 'instruments', 'genres'])
->when($this->filterCityId !== null, fn ($q) => $q->where('city_id', $this->filterCityId))
->paginate(12);
Le résultat se lit directement dans Debugbar : la page liste
15 requêtes pour toute la grille, dont les requêtes
groupées in (...) qui chargent d’un
coup les musiciens, villes, instruments et genres de tous les profils, au
lieu d’une requête par carte.