Geschwindigkeit von PHP optimieren

Für die beste Performance in der PHP Entwicklung

Manche Programmierer wollen bezüglich Geschwindigkeit, manchmal das meiste raus holen. Dazu gibt es hier mal eine Übersicht für PHP 7, inklusive Benchmark Test. Für noch mehr Performance in der PHP Entwicklung.

Zum Testen der Geschwindigkeit von PHP Code, wurden immer 2 unterschiedliche Varianten miteinander verglichen. (A-B Test) Es gab immer 3 Programmdurchläufe, aus denen dann die jeweilige Durchschnittsgeschwindigkeit ermittelt wurde. Die zeitliche Differenz wurde extra nicht Prozentual aufgezeigt, weil die Unterschiede leicht schwankten. 
Viele Benchmark-Tests fallen auch in den Bereich der Micro Optimierung. Aber eine detaillierte Auswertung dürfte trotzdem sehr interessant sein.

Grundsätzlich: Der Programmcode, sollte in Softwareprojekten (wenn möglich), immer von Anfang gut durchdacht und optimal geschrieben werden. Eine nachträgliche Optimierung, bezüglich mehr Geschwindigkeit, ist meist extrem Zeitaufwendig.

Umgebung vom Benchmark-Test: CPU Intel Core i7-4700K 4GHz, RAM 32 GB, Windows 10 Pro 64 Bit, PHP Version 7.1

Zum Performance Test: Was ist schneller

Zur besseren Übersicht einzelner Benchmarks. Folgender Programmcode wurde miteinander verglichen:

  1. echo mit doppelten oder einfachen Anführungszeichen
  2. echo mit mehreren oder nur einem Argument
  3. strtr() oder str_replace()
  4. intval() oder (int)
  5. Additionsverfahren oder Postinkrement
  6. Postinkrement oder Präinkrement
  7. array_push oder array[]

# Strings

# Echo mit doppelten oder einfachen Anführungszeichen

<?php
// doppelte Anführungszeichen
echo "string";

// einfache Anführungszeichen
echo 'string';
?>

A doppelte Anführungszeichen Ø 59,2 ns
B einfache Anführungszeichen Ø 52,4 ns

Echo mit einfachen Anführungszeichen ist schneller als echo mit doppelten Anführungszeichen.

# Echo mit einer Liste von Argumenten oder einzelnes Argument

<?php
// Liste von Argumenten
$variable "Wert";
echo 
$variable$variable$variable$variable$variable$variable$variable$variable$variable$variable;

// Einzelnes Argument
$variable "Wert";
echo 
$variable;
echo 
$variable;
echo 
$variable;
echo 
$variable;
echo 
$variable;
echo 
$variable;
echo 
$variable;
echo 
$variable;
echo 
$variable;
echo 
$variable;
?>

A Liste von Argumenten Ø 348,0 ns
B Einzelnes Argument Ø 360,7 ns

Eine Liste von Argumenten ist schneller, als immer nur ein echo mit einem einzelnem Argument.

# strtr() oder str_replace()

<?php
// str_replace
$search = ["b""c""d"];
$replace = ["2""3""4"];
for (
$i 0$i 1000000; ++$i)
{
    
str_replace($search$replace"abcd");
}

// strtr
$params = ["b" => "2""c" => "3""d" => "4"];
for (
$i 0$i 1000000; ++$i)
{
    
strtr("abcd"$params);
}
?>

A str_replace() Ø 187,3 ns
B strtr() Ø 163,1 ns

strtr() ist schneller als str_replace()

# Integer

# Eine Zahl mit intval() oder (int) konvertieren

<?php
// intval
intval(10.5);

// (int)
(int) 10.5;
?>

A intval Ø 29,5 ns
B (int) Ø 25,3 ns

(int) ist schneller als intval().

# Additionsverfahren oder Postinkrement

<?php
// Addition
$i += 1;

// Postinkrement
$i++;
?>

A Addition Ø 28,1 ns
B Inkrement Ø 21,9 ns

Inkrement $i++; ist schneller als Addition $i += 1;

# Postinkrement oder Präinkrement

<?php
// Postinkrement
$i++;

// Präinkrement
++$i;
?>

A Postinkrement Ø 25,7 ns
B Präinkrement Ø 16,5 ns

Präinkrement ++$i; ist schneller als Postinkrement $i++;.

# Arrays

# array_push() oder die $array[] Methode

<?php
// array_push Funktion
array_push($arr$value);

// $array[] method
$array[] = $value;
?>

A array_push() Ø 87,7 ns
B $array[] method Ø 36,6 ns

Die $array[] Methode ist schneller als array_push().

# Fazit

Es sollte verständlich sein, das man während der Entwicklung, immer versuchen sollte Fehler zu vermeiden. Und diese nicht nur mit @ unterdrücken. Der Test zeigt, das es bei vielen Möglichkeiten, nicht relevant ist, für welche Funktion man sich entscheidet. Wenn man im Team oder größeren Projekten arbeitet, gibt es eventuell auch Richtlinien, an denen man sich halten muss.

Relevante Unterschiede wurden bei Addition, Postinkrement und Präinkrement festgestellt.
Präinkrement ++$i ist da der Testsieger. Und schneller als $i++ oder $i += 1
Hat man die Möglichkeit, sich zwischen str_replace() und strtr() entscheiden zu können, würde ich strtr() immer bevorzugen.