Supongo que
foreach resulto ser la opcion mas rapida en ese experimiento porque es la estructura mas adecuada para recorrer cada elemento de una matriz (array) de forma "natural".
Mientras que en
while y
for realizas una operacion matematica y una comparacion en cada iteracion.
Que pasa si los indices son no consecutivos o no numericos?
array(0 => 'cero', 3 => 'tres', 'diez' => 10);
No usaras while ni for... cierto?