A sampling profiler is the one that belongs in production

An instrumenting profiler records every function call, which changes the timings it is measuring — small fast functions look disproportionately expensive because the overhead is per call.

# instrumenting: exact counts, distorted timings, huge overhead
# xdebug + cachegrind, locally, for a specific question

# sampling: statistical, low overhead, safe on a live system
# a periodic snapshot of the stack, aggregated

# the question each answers:
#   instrumenting — how many times is this called?
#   sampling      — where is the time actually going?

Sampling belongs on a production host because the overhead is a fraction of a percent and the results reflect real traffic rather than a synthetic request. Mixing the two up is how a team spends a week optimising a function that appeared expensive because it was called two million times cheaply. Both are better than the third option, which is adding microtime() calls and reasoning about the numbers.