Puoi usare microtime() segmentando le varie parti di codice in base alle operazioni che fanno e stamparti per ogni parte il tempo impiegato per l'esecuzione. per esempio potresti:

controllare il tempo che ci mette a fare gli include
controllare il tempo che ci mette a fare le query sul db
controllare il tempo per caricare i template delle view

Vedere dove si pianta e suddividere nuovamente nelle sotto operazioni.

Altrimenti puoi usare il profiler di xdebug, che va configurato ma ti elimina la rottura di scatole di segmentare il codice utilizzando microtime() e ti da un'idea chiara di cosa rallenta il tuo script.