Érdekes mérés - json_decode() vs. parse_ini_file()

Éppen ebben a pillanatban végeztem el egy érdekes mérési kísérletet, amelyben szembeállítottam a parse_ini_file() és a json_decode() függvények hatékonyságát. A mérési eredmény annyira meglepett, hogy úgy döntöttem megosztom a szélesebb közönséggel is...

Ebben a tesztben összehasonlítottam a parse_ini_file() és a json_decode() (használva a file_get_contents() függvényt is) függvényeket, hogy meglássam: egy nagyon egyszerű konfigurációs állományt melyik módszerrel gyorsabb feldolgozni. Természetesen a parse_ini_file() fölényes győzelmére számítottam, de végül igen csak meglepődtem.

Előkészületek

A teszt elvégzéséhez két konfigurációs fájlt hoztam létre.
parseini-test.ini:

[global]
a = 1
b = 2
c = "Lorem Ipsum"
d = "Dolor Sit Amet"
e = 3.14

jsondecode-test.json:

{
    "a": 1,
    "b": 2,
    "c": "Lorem Ipsum",
    "d": "Dolor Sit Amet",
    "e": 3.14
}

A mérőkódok

parseini.php:

<?php

$s = microtime(TRUE);
for ($i=0; $i<100000; $i++)
{
$a = parse_ini_file('./parseini-test.ini');
unset($a);
}
$e = microtime(TRUE);
echo $e-$s;

?>

jsondecode.php:

<?php

$s = microtime(TRUE);
for ($i=0; $i<100000; $i++)
{
$a = json_decode(file_get_contents('./jsondecode-test.json'), TRUE);
unset($a);
}
$e = microtime(TRUE);
echo $e-$s;

?>

Az eredmény

A fenti kódokat háromszor futtattam egymás után (tapasztalataim szerint a harmadik eredmény közelebb áll az átlagoshoz):
- parseini.php: 3.24759721756
- jsondecode.php: 3.289290905

A tanulság

Ezek után úgy döntöttem, hogy a json_decode() függvényt fogom használni a konfigurációs állományok feldolgozására, mivel a json_decode() és a parse_ini_file() sebessége között alig van hajszálnyi különbség, míg azt sem árt megemlíteni, hogy a JSON formátum segítségével jóval típusosabb és struktúráltabb konfigurációs állományok hozhatóak létre, nem is beszélve a formátum szélesebb felhasználhatóságából adódó előnyökről.

Megjegyzés: A json_decode() érzékeny az asszociatív kulcsnevek idézőjeleire, így azokat nem szabad elfelejteni minden esetben kitenni. A tesztet PHP 5.2-es verzión végeztem.