The /etc/profile script (called by default by all users’ shell startup) has the following lines:

if [ -x /usr/libexec/path_helper ]; then
eval `/usr/libexec/path_helper -s`
fi

This (/usr/libexec/path_helper) is a shell script which in turn has this line:

[[ "$NEWPATH" = *(*:)${p}*(:*) ]] && continue

This pattern match seems to be exponential in time complexity. When NEWPATH (derived from PATH) is around 100 characters the performance problem is neglible:

% time PATH=«100 bytes» /usr/libexec/path_helper -s

real 0m0.274s
user 0m0.264s
sys 0m0.010s

But making it 150 bytes and the problem becomes noticable:

% time PATH=«150 bytes» /usr/libexec/path_helper -s

real 0m8.313s
user 0m8.293s
sys 0m0.019s

Using 160 bytes reveals that the time complexity is indeed bad:

% time PATH=«160 bytes» /usr/libexec/path_helper -s

real 0m16.588s
user 0m16.570s
sys 0m0.015s

And just for kicks, let’s try 200 bytes:

% time PATH=«200 bytes» /usr/libexec/path_helper -s

real 4m25.442s
user 4m25.070s
sys 0m0.189s

These numbers are on a 2.66 GHz Dual-Core Intel Xeon with 3 GB RAM.

The way I generated the 200 bytes for the PATH variable was using:

% TEN=123456789:
% HUNDRED=$TEN$TEN$TEN$TEN$TEN$TEN$TEN$TEN$TEN$TEN
% time PATH=$HUNDRED$HUNDRED /usr/libexec/path_helper -s