A profile answers “which functions consumed the time” precisely and says nothing about the reason. The most common finding is that the top entry is PDOStatement::execute, which is true, unhelpful, and not a PHP problem at all.
xdebug.profiler_enable_trigger=1
xdebug.profiler_output_dir=/tmp/profiles
; then request the page with ?XDEBUG_PROFILE=1
; and open the cachegrind file in KCachegrind or Webgrind
Use the trigger rather than profiler_enable: profiling every request writes a large file each time and slows the whole site. Read the call graph rather than the flat list — a function taking 40% of the time in one call is a different problem from one taking 40% across nine thousand calls, and only the second is usually fixable in application code. Xdebug also inflates function call cost, so relative numbers are trustworthy and absolute ones are not.