SlideShare a Scribd company logo
PERFORMANCE 
IN DRUPAL 8 
Web: / Twitter: Luca Lusso @lussoluca / drupal.org: lussoluca
AGENDA 
A che punto siamo 
Utenti o sviluppatori? 
Un nuovo approccio al caching 
Profiling
A CHE PUNTO SIAMO
DRUPAL 8 BETA 3 
Le API sono stabili (a meno di qualche modifica urgente 
per correggere issue critiche) 
Gli sviluppatori possono iniziare a portare i loro moduli 
Qualcuno lo sta già usando in produzione 
drupal.com 
www.amazeelabs.com 
www.sensiolabs.co.uk 
lastcallmedia.com
DRUPAL 8 È PIÙ VELOCE DI 
DRUPAL 7? 
Beh... non ancora, ma:
UTENTI O SVILUPPATORI?
https://www.drupal.org/node/2226761 
Change all default settings and config to fast/safe 
production values
IMPOSTAZIONI PREDEFINITE 
Compressione css/js abilitata 
Cache di Twig abilitata 
Debug di Twig disabilitato 
Cache Drupal abilitata 
No jQuery caricato di default in ogni pagina
IMPOSTAZIONI PREDEFINITE 
Configurazione ottimale per usare Drupal 8 in produzione, 
così gli utenti finali non devono sapere cosa configurare per 
ottimizzare le performance del proprio sito 
Durante lo sviluppo di un sito è bene che tutte queste 
ottimizzazioni siano spente
Configurazione attivabile ambiente per ambiente e gestita 
da due file: 
settings.php 
services.yml
settings.php 
if (file_exists(__DIR__ . '/settings.local.php')) { 
include __DIR__ . '/settings.local.php'; 
} 
settings.local.php 
$settings['container_yamls'][] = DRUPAL_ROOT . 
'/sites/development.services.yml'; 
$config['system.logging']['error_level'] = 'verbose'; 
$config['system.performance']['css']['preprocess'] = FALSE; 
$config['system.performance']['js']['preprocess'] = FALSE; 
$settings['cache']['bins']['render'] = 'cache.backend.null'; 
$settings['extension_discovery_scan_tests'] = TRUE; 
$settings['rebuild_access'] = TRUE; 
development.services.yml 
services: 
cache.backend.memory: 
class: DrupalCoreCacheMemoryBackendFactory 
cache.backend.null: 
class: DrupalCoreCacheNullBackendFactory
services.yml 
parameters: 
twig.config: 
debug: true 
auto_reload: true 
cache: false 
factory.keyvalue: 
{} 
factory.keyvalue.expirable: 
{}
Debug Twig 
<!-- THEME DEBUG --> 
<!-- THEME HOOK: 'page' --> 
<!-- FILE NAME SUGGESTIONS: 
* page--front.html.twig 
* page--node.html.twig 
x page.html.twig 
--> 
<!-- BEGIN OUTPUT from 'core/themes/bartik/templates/page.html.twig' --> 
<div id="page-wrapper"><div id="page"> 
Devel Themer in core!
UN NUOVO APPROCCIO AL 
CACHING
RENDER CACHE IN DRUPAL 7 
Drupal 7 ha introdotto il caching dei render array 
$build['content'] = array( 
'#theme' => 'weather', 
'#timestamp' => $timestamp, 
'#city' => $city, 
'#pre_render' => array('current_weather_cache_pre_render'), 
'#cache' => array( 
'keys' => array('weather', $city), 
), 
); 
[...] 
drupal_render($build);
RENDER CACHE IN DRUPAL 7 
Questa cache è difficile da invalidare 
Pochi sanno che esiste e nessuno lo usa (neanche il Core, 
tranne che per i blocchi)
DRUPAL 8 
https://www.drupal.org/node/1534648 
Cache tag support 
https://www.drupal.org/node/2095167 
Entity render output is now cached by default
Drupal 7 invalida la cache delle pagine ad ogni salvataggio di 
un nodo, di un commento o di un utente! 
node.pages.inc 
function node_form_submit($form, &$form_state) { 
[...] 
// Clear the page and block caches. 
cache_clear_all(); 
[...] 
comment.module 
function comment_form_submit($form, &$form_state) { 
[...] 
// Clear the block and page caches so that anonymous users see the comment 
// they have posted. 
cache_clear_all(); 
[...] 
user.pages.inc 
function user_profile_form_submit($form, &$form_state) { 
[...] 
// Clear the page cache because pages can contain usernames and/or profile information: 
cache_clear_all(); 
[...]
Questo vuol dire che ogni volta che viene inserito anche solo 
un commento tutta la cache dei blocchi e delle pagine viene 
invalidata! 
In Drupal 7 è impossibile sapere a priori dove un 
informazione verrà stampata, se metto in cache l'output di 
un nodo e successivamente l'autore di quel nodo cambia 
non ho modo di invalidare la cache di quel nodo specifico, 
devo invalidare la cache di tutti i nodi!
CACHE TAGS IN DRUPAL 8 
Posso aggiungere dei tag agli item salvati in cache, i tag sono 
stringhe 
$tags = array( 
'node' => array(42), 
'user' => array(314), 
'taxonomy_term' => array(1337, 9001), 
); 
cache($bin)->set($cid, $value, CACHE_PERMANENT, $tags); 
Invalido tutti gli item nella cache che hanno un certo tag 
Cache::invalidateTags(array('user:314')); 
Elimino tutti gli item nella cache che hanno un certo tag 
Cache::deleteTags(array('user:314'));
CACHE TAGS IN DRUPAL 8 
A questo punto se cambiamo il nome dell'utente 314 non è 
più necessario invalidare la cache di tutti i nodi, ma solo di 
quelli che hanno user:314 come tag
ENTITÀ 
Tutte le entità (sia del Core che non) supportano questo 
meccanismo, in automatico
ENTITÀ 
comment_list 
filter_format:basic_html 
node:1 
node_view 
rendered 
taxonomy_term:1 
taxonomy_term:2 
taxonomy_term:3 
user:1 
user_view
TAGS NEI RENDER ARRAY 
return array( 
'#theme' => 'weather', // theme function 
'#data' => $weather, 
'#timestamp' => $timestamp, 
'#city' => $city, 
'#pre_render' => array('current_weather_cache_pre_render'), 
'#cache' => array( 
'keys' => array('weather', $city), 
'tags' => array("city:$city"), // cache tags 
), 
); 
city:Milano 
rendered
RENDER CACHE 
La funzione cache_clear_all() è stata rimossa in Drupal 8, 
come invalido/elimino la cache delle pagine/blocchi? 
Cache::invalidateTags(array('rendered'));
RENDER CACHE 
Resta il problema di personalizzare l'output per utenti 
diversi o per ruoli diversi, ad esempio il marker "new" sui 
commenti non letti da un utente (se metto in cache per 
utente perdo gran parte del vantaggio delle cache) 
data-attribute generici nell'HTML + javascript per 
arricchire il DOM 
#post_render_cache
RENDER CACHE 
<div 
style="top: 32px;" 
role="form" 
class="contextual-render-processed contextual" 
data-contextual-id="node:node=1:changed=1415864183" 
> 
I link contestuali fanno parte del render di un nodo ma 
cambiano in base ai permessi che l'utente ha sul nodo 
stesso. Invece di stampare l'elenco dei link direttamente 
nell'HTML (come fa Drupal 7) viene stampato un div con un 
attributo "data-contextual-id" generico, una funzione 
javascript e una chiamata ajax faranno il resto, aggiungendo 
al div l'elenco di link specifico per l'utente.
PROFILING
PROFILING 
Per poter risolvere i colli di bottiglia bisogna identificarli! 
Code level profiling 
Drupal level profiling
CODE LEVEL PROFILING 
Open source 
XHProf 
Uprofiler 
New Relic 
Blackfire.io 
Qafoo 
Commerciali
CODE LEVEL PROFILING
CODE LEVEL PROFILING
DRUPAL LEVEL PROFILING 
Webprofiler project 
www.drupal.org/project/webprofiler
WEBPROFILER
WEBPROFILER 
Asset 
Blocks 
Cache 
Config 
Database 
Extension (Modules and 
Themes) 
Events 
Form 
Memory 
PhpConfig 
Request 
Routing 
Services 
State 
Timeline 
User 
Views
AUTOMATED PERFORMANCE 
TRACKING 
https://www.drupal.org/node/2308683 
Create a 'Profiling' install profile, for testbot-powered simple 
profiling and easier local profiling
APPROFONDIMENTI 
Automagic speed cache 
Drupal 8 performance: render caching 
xhprof-kit 
Automated performance tracking 
Drupal core gates 
Modulo Render cache per Drupal 7
GRAZIE! 
Domande?
DDAY2014 - Performance in Drupal 8

More Related Content

PDF
Drupal 8 - dal download del core alla pubblicazione in produzione
PPTX
Drupal Day 2015 - Drupal 8 dal download del core alla pubblicazione in prod...
PDF
Async navigation with a lightweight ES6 framework
PPTX
Matteo Bicocchi - Introducing HTML5
PPTX
Drupal 7 : theming avanzato
PDF
High Performance Web Apps con PHP e Symfony 2
PDF
Come portare il profiler di symfony2 in drupal8
PDF
Bootstrap 3.0 - Introduzione
Drupal 8 - dal download del core alla pubblicazione in produzione
Drupal Day 2015 - Drupal 8 dal download del core alla pubblicazione in prod...
Async navigation with a lightweight ES6 framework
Matteo Bicocchi - Introducing HTML5
Drupal 7 : theming avanzato
High Performance Web Apps con PHP e Symfony 2
Come portare il profiler di symfony2 in drupal8
Bootstrap 3.0 - Introduzione

Viewers also liked (20)

PDF
Tooling, theming, made easy
PDF
DrupalGap: crea una app Android (ed iOS) con Drupal, Drupalgap ed Apache Cordova
PDF
Sviluppo Code-driven e riusabilità del codice: CMI e Features per D8
PDF
Behaviour Driven Development con Behat & Drupal
PDF
Invisiblefarm condivide l'esperienza DrupalGIS
PDF
Docker for developers
PDF
"Twig e i belli dentro": panoramica sui nuovi standard di frontend-developmen...
PDF
Drupal 8: dal download del Core alla pubblicazione in produzione. Cos'è cambi...
PDF
La piattaforma web di CNA: Istanze Drupal replicabili integrate con Alfresco ...
PDF
Drupal per la PA dell'Emilia-Romagna
PPT
DDAY2014 - Loveyourpix Case Study
PDF
DDAY2014 - Features per Drupal 8
PDF
Mantenere una distribuzione Drupal attraverso test coverage: Paddle case study
PDF
Come progettare e realizzare una distribuzione in Drupal 8
PDF
Drupal per la PA
PDF
Da X a Drupal 8, migra tutto e vivi sereno
PDF
Tooling per il tema in Drupal 8
PDF
Once you go cloud you never go down
PDF
La semantica per automatizzare una redazione web: l'esperienza di Innolabplus.eu
PDF
Your Entity, Your Code
Tooling, theming, made easy
DrupalGap: crea una app Android (ed iOS) con Drupal, Drupalgap ed Apache Cordova
Sviluppo Code-driven e riusabilità del codice: CMI e Features per D8
Behaviour Driven Development con Behat & Drupal
Invisiblefarm condivide l'esperienza DrupalGIS
Docker for developers
"Twig e i belli dentro": panoramica sui nuovi standard di frontend-developmen...
Drupal 8: dal download del Core alla pubblicazione in produzione. Cos'è cambi...
La piattaforma web di CNA: Istanze Drupal replicabili integrate con Alfresco ...
Drupal per la PA dell'Emilia-Romagna
DDAY2014 - Loveyourpix Case Study
DDAY2014 - Features per Drupal 8
Mantenere una distribuzione Drupal attraverso test coverage: Paddle case study
Come progettare e realizzare una distribuzione in Drupal 8
Drupal per la PA
Da X a Drupal 8, migra tutto e vivi sereno
Tooling per il tema in Drupal 8
Once you go cloud you never go down
La semantica per automatizzare una redazione web: l'esperienza di Innolabplus.eu
Your Entity, Your Code
Ad

Similar to DDAY2014 - Performance in Drupal 8 (20)

PDF
Drupal come framework di sviluppo
ODP
Drupal Day 2012 - DRUPAL 8: I CAMBIAMENTI CHE CI ASPETTANO
PDF
Talks on my machine: Drupal, Storybook e SDC
PPTX
PostgrSQL 9.3&9.4 - DjangoVillage
PDF
Joomla! 5.1 - Dalle novità ai prossimi passi
PDF
Slide sessione Drupal Theming & CSS Framework – Drupal Camp Torino 2010
PDF
Laravel Framework PHP
PDF
Tech Webinar: Advanced AngularJS, tecniche avanzate per padroneggiare il fram...
PDF
Perl Template Toolkit
PDF
Con Aruba, a lezione di Cloud #lezione 30 - parte 2: 'GitLab e Cloud Server ...
PDF
Talks on my machine: Drupal CMS versus The Cool Kids
PDF
MongoDB User Group Padova - Overviews iniziale su MongoDB
PDF
Html5 - Un anno dopo
PDF
Miglioriamo le performance di wordpress
PDF
Sviluppo web dall'antichità all'avanguardia e ritorno
PDF
Creare un tema personalizzato per wordpress
PPTX
Sviluppare plugin per WordPress: Best Practice e Silver Bullet
ODP
Working between the clouds
PDF
Sviluppo web con Ruby on Rails
PPTX
Performance e Drupal
Drupal come framework di sviluppo
Drupal Day 2012 - DRUPAL 8: I CAMBIAMENTI CHE CI ASPETTANO
Talks on my machine: Drupal, Storybook e SDC
PostgrSQL 9.3&9.4 - DjangoVillage
Joomla! 5.1 - Dalle novità ai prossimi passi
Slide sessione Drupal Theming & CSS Framework – Drupal Camp Torino 2010
Laravel Framework PHP
Tech Webinar: Advanced AngularJS, tecniche avanzate per padroneggiare il fram...
Perl Template Toolkit
Con Aruba, a lezione di Cloud #lezione 30 - parte 2: 'GitLab e Cloud Server ...
Talks on my machine: Drupal CMS versus The Cool Kids
MongoDB User Group Padova - Overviews iniziale su MongoDB
Html5 - Un anno dopo
Miglioriamo le performance di wordpress
Sviluppo web dall'antichità all'avanguardia e ritorno
Creare un tema personalizzato per wordpress
Sviluppare plugin per WordPress: Best Practice e Silver Bullet
Working between the clouds
Sviluppo web con Ruby on Rails
Performance e Drupal
Ad

More from DrupalDay (20)

PDF
[drupalday 2017] - Accessibilità Web: Finalità, metodologie e strumenti.
PDF
[drupalday2017] - Cloud e integrazione per la PA: la sfida dell'Open Source t...
PDF
[drupalday2017] - Drupal come frontend che consuma servizi: HTTP Client Manager
PDF
[drupalday2017] - Drupal & Patternlab: un nuovo approccio al theming
PDF
[drupalday2017] - Decoupled frontend con Drupal 8 e OpenUI 5
PDF
[drupalday2017] - Open Data con Drupal nella PA: considerazioni su licensing ...
PDF
[drupalday2017] - Behat per Drupal: test automatici e molto di più
PDF
[drupalday2017] - Drupal 4 Stakeholders
PDF
[drupalday2017] - DRUPAL per la PA: il modello della Trasparenza di Sapienza
PDF
[drupalday2017] - Venezia & Drupal. Venezia è Drupal!
PDF
[drupalday2017] - Quando l’informazione è un servizio
PDF
[drupalday2017] - Cosa significa convertire un modulo da D7 a D8
PDF
[drupalday2017 - KEYNOTE] - Saving the world one Open Source project at a time
PDF
[drupalday2017] - Async navigation with a lightweight ES6 framework
PDF
[drupalday2017] - Devel - D8 release party
PDF
[drupalday2017] - Speed-up your Drupal instance!
PDF
[drupalday2017] - DevOps: strumenti di automazione per Drupal8
PDF
[drupalday2017] - DevOps: strumenti di automazione per Drupal8
PDF
[drupalday2017] - REST in pieces
PDF
[drupalday2017] - Contenuti educativi digitali aperti, creare contenuti e dis...
[drupalday 2017] - Accessibilità Web: Finalità, metodologie e strumenti.
[drupalday2017] - Cloud e integrazione per la PA: la sfida dell'Open Source t...
[drupalday2017] - Drupal come frontend che consuma servizi: HTTP Client Manager
[drupalday2017] - Drupal & Patternlab: un nuovo approccio al theming
[drupalday2017] - Decoupled frontend con Drupal 8 e OpenUI 5
[drupalday2017] - Open Data con Drupal nella PA: considerazioni su licensing ...
[drupalday2017] - Behat per Drupal: test automatici e molto di più
[drupalday2017] - Drupal 4 Stakeholders
[drupalday2017] - DRUPAL per la PA: il modello della Trasparenza di Sapienza
[drupalday2017] - Venezia & Drupal. Venezia è Drupal!
[drupalday2017] - Quando l’informazione è un servizio
[drupalday2017] - Cosa significa convertire un modulo da D7 a D8
[drupalday2017 - KEYNOTE] - Saving the world one Open Source project at a time
[drupalday2017] - Async navigation with a lightweight ES6 framework
[drupalday2017] - Devel - D8 release party
[drupalday2017] - Speed-up your Drupal instance!
[drupalday2017] - DevOps: strumenti di automazione per Drupal8
[drupalday2017] - DevOps: strumenti di automazione per Drupal8
[drupalday2017] - REST in pieces
[drupalday2017] - Contenuti educativi digitali aperti, creare contenuti e dis...

DDAY2014 - Performance in Drupal 8

  • 1. PERFORMANCE IN DRUPAL 8 Web: / Twitter: Luca Lusso @lussoluca / drupal.org: lussoluca
  • 2. AGENDA A che punto siamo Utenti o sviluppatori? Un nuovo approccio al caching Profiling
  • 3. A CHE PUNTO SIAMO
  • 4. DRUPAL 8 BETA 3 Le API sono stabili (a meno di qualche modifica urgente per correggere issue critiche) Gli sviluppatori possono iniziare a portare i loro moduli Qualcuno lo sta già usando in produzione drupal.com www.amazeelabs.com www.sensiolabs.co.uk lastcallmedia.com
  • 5. DRUPAL 8 È PIÙ VELOCE DI DRUPAL 7? Beh... non ancora, ma:
  • 7. https://www.drupal.org/node/2226761 Change all default settings and config to fast/safe production values
  • 8. IMPOSTAZIONI PREDEFINITE Compressione css/js abilitata Cache di Twig abilitata Debug di Twig disabilitato Cache Drupal abilitata No jQuery caricato di default in ogni pagina
  • 9. IMPOSTAZIONI PREDEFINITE Configurazione ottimale per usare Drupal 8 in produzione, così gli utenti finali non devono sapere cosa configurare per ottimizzare le performance del proprio sito Durante lo sviluppo di un sito è bene che tutte queste ottimizzazioni siano spente
  • 10. Configurazione attivabile ambiente per ambiente e gestita da due file: settings.php services.yml
  • 11. settings.php if (file_exists(__DIR__ . '/settings.local.php')) { include __DIR__ . '/settings.local.php'; } settings.local.php $settings['container_yamls'][] = DRUPAL_ROOT . '/sites/development.services.yml'; $config['system.logging']['error_level'] = 'verbose'; $config['system.performance']['css']['preprocess'] = FALSE; $config['system.performance']['js']['preprocess'] = FALSE; $settings['cache']['bins']['render'] = 'cache.backend.null'; $settings['extension_discovery_scan_tests'] = TRUE; $settings['rebuild_access'] = TRUE; development.services.yml services: cache.backend.memory: class: DrupalCoreCacheMemoryBackendFactory cache.backend.null: class: DrupalCoreCacheNullBackendFactory
  • 12. services.yml parameters: twig.config: debug: true auto_reload: true cache: false factory.keyvalue: {} factory.keyvalue.expirable: {}
  • 13. Debug Twig <!-- THEME DEBUG --> <!-- THEME HOOK: 'page' --> <!-- FILE NAME SUGGESTIONS: * page--front.html.twig * page--node.html.twig x page.html.twig --> <!-- BEGIN OUTPUT from 'core/themes/bartik/templates/page.html.twig' --> <div id="page-wrapper"><div id="page"> Devel Themer in core!
  • 14. UN NUOVO APPROCCIO AL CACHING
  • 15. RENDER CACHE IN DRUPAL 7 Drupal 7 ha introdotto il caching dei render array $build['content'] = array( '#theme' => 'weather', '#timestamp' => $timestamp, '#city' => $city, '#pre_render' => array('current_weather_cache_pre_render'), '#cache' => array( 'keys' => array('weather', $city), ), ); [...] drupal_render($build);
  • 16. RENDER CACHE IN DRUPAL 7 Questa cache è difficile da invalidare Pochi sanno che esiste e nessuno lo usa (neanche il Core, tranne che per i blocchi)
  • 17. DRUPAL 8 https://www.drupal.org/node/1534648 Cache tag support https://www.drupal.org/node/2095167 Entity render output is now cached by default
  • 18. Drupal 7 invalida la cache delle pagine ad ogni salvataggio di un nodo, di un commento o di un utente! node.pages.inc function node_form_submit($form, &$form_state) { [...] // Clear the page and block caches. cache_clear_all(); [...] comment.module function comment_form_submit($form, &$form_state) { [...] // Clear the block and page caches so that anonymous users see the comment // they have posted. cache_clear_all(); [...] user.pages.inc function user_profile_form_submit($form, &$form_state) { [...] // Clear the page cache because pages can contain usernames and/or profile information: cache_clear_all(); [...]
  • 19. Questo vuol dire che ogni volta che viene inserito anche solo un commento tutta la cache dei blocchi e delle pagine viene invalidata! In Drupal 7 è impossibile sapere a priori dove un informazione verrà stampata, se metto in cache l'output di un nodo e successivamente l'autore di quel nodo cambia non ho modo di invalidare la cache di quel nodo specifico, devo invalidare la cache di tutti i nodi!
  • 20. CACHE TAGS IN DRUPAL 8 Posso aggiungere dei tag agli item salvati in cache, i tag sono stringhe $tags = array( 'node' => array(42), 'user' => array(314), 'taxonomy_term' => array(1337, 9001), ); cache($bin)->set($cid, $value, CACHE_PERMANENT, $tags); Invalido tutti gli item nella cache che hanno un certo tag Cache::invalidateTags(array('user:314')); Elimino tutti gli item nella cache che hanno un certo tag Cache::deleteTags(array('user:314'));
  • 21. CACHE TAGS IN DRUPAL 8 A questo punto se cambiamo il nome dell'utente 314 non è più necessario invalidare la cache di tutti i nodi, ma solo di quelli che hanno user:314 come tag
  • 22. ENTITÀ Tutte le entità (sia del Core che non) supportano questo meccanismo, in automatico
  • 23. ENTITÀ comment_list filter_format:basic_html node:1 node_view rendered taxonomy_term:1 taxonomy_term:2 taxonomy_term:3 user:1 user_view
  • 24. TAGS NEI RENDER ARRAY return array( '#theme' => 'weather', // theme function '#data' => $weather, '#timestamp' => $timestamp, '#city' => $city, '#pre_render' => array('current_weather_cache_pre_render'), '#cache' => array( 'keys' => array('weather', $city), 'tags' => array("city:$city"), // cache tags ), ); city:Milano rendered
  • 25. RENDER CACHE La funzione cache_clear_all() è stata rimossa in Drupal 8, come invalido/elimino la cache delle pagine/blocchi? Cache::invalidateTags(array('rendered'));
  • 26. RENDER CACHE Resta il problema di personalizzare l'output per utenti diversi o per ruoli diversi, ad esempio il marker "new" sui commenti non letti da un utente (se metto in cache per utente perdo gran parte del vantaggio delle cache) data-attribute generici nell'HTML + javascript per arricchire il DOM #post_render_cache
  • 27. RENDER CACHE <div style="top: 32px;" role="form" class="contextual-render-processed contextual" data-contextual-id="node:node=1:changed=1415864183" > I link contestuali fanno parte del render di un nodo ma cambiano in base ai permessi che l'utente ha sul nodo stesso. Invece di stampare l'elenco dei link direttamente nell'HTML (come fa Drupal 7) viene stampato un div con un attributo "data-contextual-id" generico, una funzione javascript e una chiamata ajax faranno il resto, aggiungendo al div l'elenco di link specifico per l'utente.
  • 29. PROFILING Per poter risolvere i colli di bottiglia bisogna identificarli! Code level profiling Drupal level profiling
  • 30. CODE LEVEL PROFILING Open source XHProf Uprofiler New Relic Blackfire.io Qafoo Commerciali
  • 33. DRUPAL LEVEL PROFILING Webprofiler project www.drupal.org/project/webprofiler
  • 35. WEBPROFILER Asset Blocks Cache Config Database Extension (Modules and Themes) Events Form Memory PhpConfig Request Routing Services State Timeline User Views
  • 36. AUTOMATED PERFORMANCE TRACKING https://www.drupal.org/node/2308683 Create a 'Profiling' install profile, for testbot-powered simple profiling and easier local profiling
  • 37. APPROFONDIMENTI Automagic speed cache Drupal 8 performance: render caching xhprof-kit Automated performance tracking Drupal core gates Modulo Render cache per Drupal 7