softmixx background

PHP Code Optimierung

PHP, Full Stack Development

foreach Performance Benchmark

[ 31.03.2021 | Alex]
In der Regel ist foreach anderen PHP Schleifen Konstrukten für Array Iteration wie while usw. in der Performance überlegen. foreach selber kann allerdings in zwei Varianten verwendet werden, deren Benchmarks hab ich mal mit einem kleinen Script untersucht.

In der ersten Form (1) wird zunächst nur der aktuelle Elementwert an die Variable $unit übergeben, jedoch , damit wir das Element manipulieren können, als Referenz (mit & vor $unit):

foreach( $xml_array as &$unit ) {
  if( is_object($unit) ) {
   $unit = binds(Array());
  }
  }

Mehrere Durchläufe ergeben hier folgende Vergleichswerte:

Benötigte Zeit: 0.0055680274963379s
Benötigte Zeit: 0.0053200721740723s
Benötigte Zeit: 0.0053398609161377s
Benötigte Zeit: 0.0054318904876709s
Benötigte Zeit: 0.0053379535675049s

In der zweiten Variante (2) mit Übergabe des Schlüssels 

foreach( $xml_array as $key => $unit ) {
  if( is_object($unit) ) {
   $xml_array[$key] = binds(Array());
  }
  }

erhalte ich folgende Daten:

Benötigte Zeit: 0.0047681331634521s
Benötigte Zeit: 0.004770040512085s
Benötigte Zeit: 0.0047881603240967s
Benötigte Zeit: 0.0046250820159912s
Benötigte Zeit: 0.0046789646148682s

Fazit: Anders als vermutet, hat die Verwendung einer Element Referenz keinen Performance Vorteil bei assoziativen Arrays mit einer kleinen Anzahl an Elementen. Im Gegenteil ist die Variante mit Schlüssel Zuweisung sogar durchweg schneller. Der Unterschied wird erst mit einer sehr hohen Anzahl an Array Elementen nicht mehr relevant. Hat das Array 10.000 key/value Paare sind die Werte gleichauf:

(1):

Benötigte Zeit: 0.07724404335022s
Benötigte Zeit: 0.076985836029053s
Benötigte Zeit: 0.076574087142944s
Benötigte Zeit: 0.077075004577637s
Benötigte Zeit: 0.077598810195923s

(2):

Benötigte Zeit: 0.07767391204834s
Benötigte Zeit: 0.077567100524902s
Benötigte Zeit: 0.077085018157959s
Benötigte Zeit: 0.077534914016724s
Benötigte Zeit: 0.077549934387207s