Dossier qualité Giggr. · PFE Hugo Girona

Aller au contenu
Giggr.

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.

Requêtes SQL, temps serveur et mémoire par page
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.

Laravel Debugbar, onglet Database sur la page Explorer: 15 requêtes.
Debugbar, onglet Database sur Explorer (profils) : 15 requêtes pour la grille entière, dont les requêtes groupées de l’eager loading.