Ich bin mir noch nicht ganz sicher ob ich INI nicht die irgendwie nach json "compiliere"
Mir geht es vor allem darum, dass die manuell geänderte INI nur einmal geprüft wird. Das json oder was auch immer ich erzeuge wird dann nicht nochmals geprüft, gefiltert oder sonstwas. Das dürfte auf belasteten oder schwachen Servern dann schon Zeit sparen...
Für Konfigs wie diese hier möchte ich in Gänze
Der Performance-Test mit genau Deinen Daten auf dem Banana:
<?php
header("Content-Type:text/plain; charset=utf8");
$data=file('data.csv');
$ar=array();
foreach ($data as $row) {
$ar[]=explode('|', trim($row));
}
file_put_contents('data.json', json_encode($ar));
file_put_contents('data.php','<?php $ar='.preg_replace('/\s+/',' ',var_export($ar,true)).';');
?>
=============================
Lese 1000 mal die data.csv:
=============================
<?php
$ar = array();
$s = microtime(1);
$ar = array();
for ($i=1; $i < 1000; $i++) {
$data = file('data.csv');
$ar = array();
foreach ($data as $row) {
$ar[] = explode( '|', trim($row) );
}
}
$e = microtime(1);
echo 'Array hat ' .count($ar). " Items.\n";
echo ($e-$s), ' Sekunden (avg. ' . ($e -$s) . ' ms pro Lesevorgang)', "\n\n";
?>
=============================
Lese 1000 mal die data.json:
=============================
<?php
$ar = array();
$s = microtime(1);
$ar = array();
for ( $i=1; $i<1000; $i++ ) {
$ar = json_decode(file_get_contents('data.json'));
}
$e = microtime(1);
echo 'Array hat ' .count($ar). " Items.\n";
echo ($e-$s), ' Sekunden (avg. ' . ($e -$s) . ' ms pro Lesevorgang)', "\n\n";
?>
=============================
Lese 1000 mal die data.php:
=============================
<?php
$ar = array();
$s = microtime(1);
$ar = array();
for ( $i = 1; $i < 1000; $i++ ) {
include('data.php');
}
$e = microtime(1);
echo 'Array hat ' .count($ar). " Items.\n";
echo ($e-$s), ' Sekunden (avg. ' . ($e -$s) . ' ms pro Lesevorgang)', "\n\n";
Abrufbar unter: https://home.fastix.org/Tests/performance_data_read/
Banana PI M3 mit PHP 7.0.12-1+deb.sury.org~trusty+1 (cli) ( NTS ):
=============================
Lese 1000 mal die data.csv:
=============================
Array hat 307 Items.
1.9917180538177 Sekunden (avg. 1.9917180538177 ms pro Lesevorgang)
=============================
Lese 1000 mal die data.json:
=============================
Array hat 307 Items.
1.2487099170685 Sekunden (avg. 1.2487099170685 ms pro Lesevorgang)
=============================
Lese 1000 mal die data.php:
=============================
Array hat 307 Items.
0.0023698806762695 Sekunden (avg. 0.0023698806762695 ms pro Lesevorgang)
-
Auffällig ist, dass JSON sehr viel schneller geworden ist als CSV.
-
Offensichtlich nimmt PHP7 hier irgendeinen internen Cache oder der Interpreter imgeht es anders, die Datei 1000 x zu inkludieren. Das macht auch Sinn, z.b. im Hinblick auf Microtemplates. Also noch ein Test mit PHP vor Version 7:
Auf dem "richtigen" Rechner mit PHP 5.5.9-1ubuntu4.20 (cli) (built: Oct 3 2016 13:00:37) ergab sich wie folgt:
php test.php
=============================
Lese 1000 mal die data.csv:
=============================
Array hat 307 Items.
0.70170998573303 Sekunden (avg. 0.70170998573303 ms pro Lesevorgang)
=============================
Lese 1000 mal die data.json:
=============================
Array hat 307 Items.
1.1871249675751 Sekunden (avg. 1.1871249675751 ms pro Lesevorgang)
=============================
Lese 1000 mal die data.php:
=============================
Array hat 307 Items.
1.7161350250244 Sekunden (avg. 1.7161350250244 ms pro Lesevorgang)
Hier ist der extrem primitive CSV Reader zwar schneller, kann aber nicht komplexes einlesen. In dem Fall ist die Zeit für JSON vertretbar.