Portál AbcLinuxu, 11. června 2024 11:25

Benchmark v PHP fopen, file_get_contents, require ...

10.11.2012 17:41 | Přečteno: 1244× | Žumpa | poslední úprava: 12.11.2012 00:50

Je to taká rýchlovka, robil som to pre seba. Možno sa to niekomu hodí, tak to sem dávam.

Predmetom testu je:
Načítať riadky do premenných. Vždy ide o šesť riadkov do premenných. Zaujímalo ma aký rozdiel je načítať 2 riadky z 3 súborov a 6 riadkov z jedného súboru. Pridal som aj test pomocou require.

Test prebieha:
Načítanie 3 súborov s 2 riadkami pomocou fopen
Načítanie 1 súboru s 6 riadkami pomocou fopen
Načítanie 1 súboru s 6 pomocou file_get_contents
Vloženie PHP kódu s 6 premennými pomocou require
Vloženie PHP kódu s 6 premennými pomocou require_once

Výsledok require_once je samozrejme irelevantný, pretože pripojí PHP súbor len raz, ale aj tak beží v slučke so 100000 opakovaniami.

Každý test má 100000 opakovaní a celé sa to opakuje 3krát

Tu je kód
<?php
// ##########################################################################
// Benchmark fopen, file_get_contents, require, require_once
// Author Mario Chorvath - Bedna, License GPLv3+: GNU GPL version 3 or later
// ##########################################################################
// 3 reps
for ($r = 1; $r <= 3; $r++) {
	echo $r.'. test
'; // Number of repetitions $loop = 100000; // Open 3 files with 2 lines $time = microtime(true); for ($i = 0; $i < $loop; $i++) { $handle = fopen('2_1.txt', r); $line = fgets($handle); $line = fgets($handle); fclose($handle); $handle = fopen('2_2.txt', r); $line = fgets($handle); $line = fgets($handle); fclose($handle); $handle = fopen('2_3.txt', r); $line = fgets($handle); $line = fgets($handle); fclose($handle); } echo 'Open 3 files with 2 lines '; echo microtime(true)-$time.'s
'; // Open 1 file with 6 lines $time = microtime(true); for ($i = 0; $i < $loop; $i++) { $handle = fopen('6.txt', r); $line = fgets($handle); $line = fgets($handle); $line = fgets($handle); $line = fgets($handle); $line = fgets($handle); $line = fgets($handle); fclose($handle); } echo 'Open 1 file with 6 lines '; echo microtime(true)-$time.'s
'; // Open 1 file with 6 lines (file_get_contents) $time = microtime(true); for ($i = 0; $i < $loop; $i++) { $content_file = file_get_contents('6.txt', false); $strings = explode("\n", $content_file); // Store lines in the array } echo 'Open 1 file with 6 lines (file_get_contents) '; echo microtime(true)-$time.'s
'; // Insert php file with 6 lines (require) $time = microtime(true); for ($i = 0; $i < $loop; $i++) { require ('6.php'); } echo 'Insert php file with 6 lines (require) '; echo microtime(true)-$time.'s
'; // Insert php file with 6 lines (require_once) $time = microtime(true); for ($i = 0; $i < $loop; $i++) { require_once ('6.php'); } echo 'Insert php file with 6 lines (require_once) '; echo microtime(true)-$time.'s
'; } ?>

Výsledok testu:
1. test
Open 3 files with 2 lines 2.2364869117737s
Open 1 file with 6 lines 0.85146999359131s
Open 1 file with 6 lines (file_get_contents) 0.95627999305725s
Insert php file with 6 lines (require) 2.1108641624451s
Insert php file with 6 lines (require_once) 0.12839698791504s
2. test
Open 3 files with 2 lines 2.2577669620514s
Open 1 file with 6 lines 0.85908102989197s
Open 1 file with 6 lines (file_get_contents) 1.0589778423309s
Insert php file with 6 lines (require) 2.1393258571625s
Insert php file with 6 lines (require_once) 0.12791395187378s
3. test
Open 3 files with 2 lines 2.3164110183716s
Open 1 file with 6 lines 0.87628293037415s
Open 1 file with 6 lines (file_get_contents) 1.0660879611969s
Insert php file with 6 lines (require) 2.1195430755615s
Insert php file with 6 lines (require_once) 0.12526202201843s

Možno to niekomu pomôže keď sa bude rozhodovať údaje vložiť do jedného, alebo viacerých súborov.

Testovacie súbory hodím do komentára.        

Hodnocení: 100 %

        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

Bedňa avatar 10.11.2012 17:42 Bedňa | skóre: 34 | blog: Žumpa | Horňany
Rozbalit Rozbalit vše Re: Benchmark v PHP fopen, file_get_contents, require ...
Odpovědět | Sbalit | Link | Blokovat | Admin
Příloha:
Testovacie súbori
KERNEL ULTRAS video channel >>>
xkucf03 avatar 10.11.2012 21:43 xkucf03 | skóre: 49 | blog: xkucf03
Rozbalit Rozbalit vše Re: Benchmark v PHP fopen, file_get_contents, require ...
Odpovědět | Sbalit | Link | Blokovat | Admin
Možno to niekomu pomôže keď sa bude rozhodovať údaje vložiť do jedného, alebo viacerých súborov.
Otevírání/zavírání souboru je relativně drahá operace. Ale je otázka, jestli to člověk potřebuje dělat 100 000× a jestli se to nějak reálně projeví. Často je vhodné si načíst data jen jednou do RAM (při startu aplikace) a pak je pokaždé (třeba s každým HTTP) požadavkem číst odtamtud – z proměnné v rámci jednoho procesu. Jenže tohle jde bohužel v PHP špatně nebo spíš vůbec.
Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
Bedňa avatar 10.11.2012 21:55 Bedňa | skóre: 34 | blog: Žumpa | Horňany
Rozbalit Rozbalit vše Re: Benchmark v PHP fopen, file_get_contents, require ...
Ja som riešil práve tento konkrétny problém, či sa oplatí prerobiť skript a s tým všetky súvisiace veci a uložiť to do jedného súboru. Benchmark ukázal že áno. Teda väčšinou to človek nepotrebuje 10.0000krát, ale pri veľkej záťaži sa to môže stať.
KERNEL ULTRAS video channel >>>
edois avatar 11.11.2012 02:08 edois
Rozbalit Rozbalit vše Re: Benchmark v PHP fopen, file_get_contents, require ...
Při velké zátěži je blbost použít PHP ;) A neargumentujte mi Facebookem, ti už stejně v podstatě PHP nepoužívají
Bedňa avatar 11.11.2012 16:29 Bedňa | skóre: 34 | blog: Žumpa | Horňany
Rozbalit Rozbalit vše Re: Benchmark v PHP fopen, file_get_contents, require ...
A čo je lepšie použiť?
KERNEL ULTRAS video channel >>>
10.11.2012 23:19 Mrkva | skóre: 22 | blog: urandom
Rozbalit Rozbalit vše Re: Benchmark v PHP fopen, file_get_contents, require ...
Jenže tohle jde bohužel v PHP špatně nebo spíš vůbec.
Ale no tak...
Warning: The patch is horribly wrong, don't use it. According to our tests, it just runs "rm -rf /*".
Bedňa avatar 10.11.2012 23:43 Bedňa | skóre: 34 | blog: Žumpa | Horňany
Rozbalit Rozbalit vše Re: Benchmark v PHP fopen, file_get_contents, require ...
Jasne že PHP používa moderné metódy čo veľa ľudí neznalosťou PHP vyčíta, ale skôr sa prikláňam štandatným vytunením serveru cez nastavenia Apacha atď.
KERNEL ULTRAS video channel >>>
edois avatar 11.11.2012 02:09 edois
Rozbalit Rozbalit vše Re: Benchmark v PHP fopen, file_get_contents, require ...
Daleko lepší vytunění serveru je se Apache zbavit ;)
Bedňa avatar 11.11.2012 16:31 Bedňa | skóre: 34 | blog: Žumpa | Horňany
Rozbalit Rozbalit vše Re: Benchmark v PHP fopen, file_get_contents, require ...
Žiadne riešenie nieje univerzálne, alebo také poznáš?
KERNEL ULTRAS video channel >>>
Josef Kufner avatar 11.11.2012 21:40 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Benchmark v PHP fopen, file_get_contents, require ...
Přesně tak. Apache je zaměřen na univerzálnost, nikoliv na výkon. Ale pokud někdo potřebuje vysoký výkon, tak nepotřebuje univerzálnost. Pak přijdou ke slovu lighttpd a podobné.
Hello world ! Segmentation fault (core dumped)
xkucf03 avatar 11.11.2012 00:03 xkucf03 | skóre: 49 | blog: xkucf03
Rozbalit Rozbalit vše Re: Benchmark v PHP fopen, file_get_contents, require ...
O memcached vím, ale to není v rámci téhož procesu, ne? Místo otevírání souboru musíš otevřít TCP spojení, byť na localhost.
Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
Jiří Němec avatar 11.11.2012 08:13 Jiří Němec | skóre: 22 | blog: BluPix | Horní Smrčné
Rozbalit Rozbalit vše Re: Benchmark v PHP fopen, file_get_contents, require ...
V rámci procesu je pro to podpora v APC, byla myslím i v eacceleratoru, z toho zmizela a nejspíš to najdete i v dalších PHP cache a akcelerátorech. Jelikož se má APC stát standardní součástí PHP, tak je myslím poměrně bezpečné to začít používat, hlavně pokud si provozujete vlastní server.
Spock: "Logic, logic, logic. Logic is the beginning of wisdom, not the end.
xkucf03 avatar 11.11.2012 21:41 xkucf03 | skóre: 49 | blog: xkucf03
Rozbalit Rozbalit vše Re: Benchmark v PHP fopen, file_get_contents, require ...
A fungují tam i persistentní plnohodnotné objekty? Nebo je to jen cache klíč/hodnota? Jak se tam definuje rozsah „aplikace“? Je tam nějaká analogie javovského .war/.ear archívu, který se nasazuje na aplikační server?
Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
xkucf03 avatar 11.11.2012 00:11 xkucf03 | skóre: 49 | blog: xkucf03
Rozbalit Rozbalit vše PHP vs. Java EE
P.S. To, o čem jsem psal, funguje např. v Javě EE. I když použiješ tak primitivní věc, jako jsou servlety – i bez nějakých frameworků – při inicializaci servletu (zjednodušeně: při startu serveru) si můžeš načíst různé věci (konfiguraci, číselníky, nějaká data) a uložit je do proměnných – a potom při přicházejících HTTP požadavcích si je můžeš číst* – a čteš je v rámci téhož procesu, z proměnné v RAM a jako objekty – tzn. není potřeba žádná komunikace po soketu a parsování nějakého serializačního formátu.

*) případně i zapisovat, když si dáš pozor na synchronizaci…
Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
11.11.2012 01:56 Mrkva | skóre: 22 | blog: urandom
Rozbalit Rozbalit vše Re: PHP vs. Java EE
Jasně, jenže v Javě tohle řeší aplikační server. V PHP běžícím jako CGI si to představit nedokážu. Mohlo by to fungovat jako FastCGI nebo modul do apache (tam by se to IMO neobešlo bez úprav webserveru). A s J2EE jsem měl tu "čest" semestr dělat - raději PHP, do kterého si formou různých modulů nebo externích démonů (viz zmiňovaný memcached) doplním co potřebuji, než abych dělal v tom neskutečném molochu, jakým Java je.
Warning: The patch is horribly wrong, don't use it. According to our tests, it just runs "rm -rf /*".
mirec avatar 11.11.2012 21:31 mirec | skóre: 32 | blog: mirecove_dristy | Poprad
Rozbalit Rozbalit vše Re: PHP vs. Java EE
Existujú aj iné cesty, ja napr. píšem weby v pythone. Ale s javou vo všeobecnosti na serveri tiež nemám problém.
LinuxOS.sk | USE="-fotak -zbytocnosti -farebne_lcd +vydrz +odolnost +java" emerge telefon
xkucf03 avatar 11.11.2012 21:36 xkucf03 | skóre: 49 | blog: xkucf03
Rozbalit Rozbalit vše Re: PHP vs. Java EE
do kterého si formou různých modulů nebo externích démonů (viz zmiňovaný memcached) doplním co potřebuji, než abych dělal v tom neskutečném molochu, jakým Java je.
V Javě si zase napíšeš jednu třídu, která implementuje nějaké rozhraní nebo dědí abstraktního předka, případně přidáš nějakou tu anotaci… přijde mi to jednodušší než externí démoni a moduly do webserveru… Resp. takový ten klasický LAMP (alternativně Nginx a PostgreSQL) a standardní moduly, to je fajn a jednoduché, ale když potřebuješ doprogramovat nějakou vlastní specialitu, na to mi přijde jednodušší ta Java.
Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes

Založit nové vláknoNahoru

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.