Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Need for Speed, czyli rozważania dotyczące prędkości
W czym wolisz zapisywać dane?
W czym wolisz zapisywać dane?
Pliki Txt (mechanizmy PHP) [ 37 ] ** [11.08%]
Baza MySQL [ 297 ] ** [88.92%]
Suma głosów: 192
Goście nie mogą głosować 
DeyV
post
Post #1





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




Od dawna stosowane są mechanizmy służące do zapisywania wyników z bazy danych w plikach tekstowych, w celu przyspieszenie pracy skryptów (cash). I jest to całkiem logiczne, szczególnie w przypadku bardziej złożonych zapytań.
Jednak ostatnio, chyba wraz z pojawieniem się najnowszej wersji xmb_forum (Partagium) zwróciłem uwagę na nową tendencję: zastępowanie plików tekstowych bazą danych. W forum tym wszystkie pliki szablonów (templates) zostały umieszczone w bazie. I przyznam się szczerze, że mocno mnie to zaskoczyło. Bo choć do zalet stosowania zapisu w bazie chyba nikogo nie trzeba przekonywać (łatwość w aktualizacji, katalogowaniu, brak problemów z nadawaniem CHMOD itp.) to jednak przekonany byłem, że rozwiązanie takie musi być o wiele wolniejsze.
Skłoniło mnie to do przeprowadzenia serii testów. Umieszczam tu kilka z wyników, które mam nadzieję skłonią Was do zastanowienie się nad tym tematem. Wszystkie zostały wykonane przy pomocy malutkiego skryptu zapisującego i przeliczającego wyniki, który można ściągnąć stąd:
www.mStudio.nQ.pl/download/scrypty/czas/czas.zip na Windows XP, z Apachem 1,3, php 4.3 oraz MySQL 3.23
A tu jest przykład kodu testów

A1. wyświetlamy zawartość małego pliku (1,4 KB) z pliku tekstowego (wyniki w sekundach):
Cytat
Ilość prób=20
średni czas = 0.00299039483070
max czas=0.0046200752;
min_czas= 0.0020439625
suma = 0.0598078966
A2. Ten sam tekst z bazy MySQL zawierającej tylko ten jeden rekord:
Cytat
Ilość prób=20
średni czas = 0.00293679833412 (mniej niż z pliku !)
max czas=0.0047850609;
min_czas= 0.0023930073
suma = 0.0587359667
A3. Taki sam tekst, lecz z tabeli zawierającej około 200 rekordów
Cytat
Ilość prób=20
średni czas = 0.00319704413414
max czas=0.0045739412
min_czas= 0.0025489330
suma = 0.0639408827

-----------------------------

B1. wyświetlamy zawartość pliku (61 KB) z pliku tekstowego (wyniki w sekundach):
Cytat
Ilość prób=20
średni czas = 0. 07095720171928
max czas=0. 1114130020;
min_czas= 0. 0573480129
suma = 1. 4191440344
B2. Ten sam tekst z bazy MySQL zawierającej tylko ten jeden rekord:
Cytat
Ilość prób=20
średni czas = 0. 09079620242119  
max czas=0. 1551539898;
min_czas= 0. 0670330524
suma = 1. 8159240484
B3. Taki sam tekst, lecz z tabeli zawierającej około 200 rekordów
Cytat
Ilość prób=20
średni czas = 0. 08866938948631
max czas=0. 1459870338
min_czas= 0. 0688790083
suma = 1. 7733877897
Podsumowanie:
Pliki rzeczywiście zazwyczaj są szybsze, ale nie tak bardzo, jak by się mogło wydawać. Zaskakujące efekty dało również porównanie wyników MySQL. Okazało się, że wielkość bazy (przynajmniej w porównaniu 1-200) nie ma wpływu na prędkość wykonywania zapytań. Czasami wręcz (sic!) większa baza jest szybsza...
Co o tym sądzicie?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
ShaXbee
post
Post #2





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 19.10.2004
Skąd: Opole

Ostrzeżenie: (0%)
-----


To mój pierwszy post na Forum php Pro. Oby wyszedł dobrze (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Ponieważ w mojej pracy dyplomowej mam do czynienia z dużą ilością cache-owalnych danych różnego rodzaju (wygenerowane strony, pliki XML, starsze statystyki) postanowiłem przeprowadzić test porównawczy dla różnych rodzajów danych.

Test składa się z 3 plików, 1 jest tworzony podczas pracy. Więcej szczegółów w źródłach.

Wyniki pracy na moim komputerze (Celeron 800, 394MB RAM, Win XP Prof, php 5.0.2):

Include z kodem php: 5.17731785774
Plik z 'serializowana' tablica: 3.72141003609
Tabela MySQL z 'serializowana' tablica: 4.31501793861
Pamięć współdzielona: 0.0416531562805

Edit:
Link do zipa z plikami testu: http://shaxbee.net/benchmark.zip - tym razem Dziala (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Plik benchmark.php
  1. <?
  2.  
  3. /*
  4.  
  5.  Simple Data Sources Access Benchmark
  6.  Author: Zbyszek \"ShaXbee\" Mandziejewicz
  7.  E-mail: shax at shaxbee dot net
  8.  
  9.  Sharemem benchmark requires enabled module php_shmop.dll (Win) and dosen't run on
  10.  Windows 9x/Me
  11.  
  12.  Before running MySQL Benchmark change _SQL_HOST, _SQL_USER, _SQL_PASS,
  13.  _SQL_DB and execute bench.sql
  14.  
  15.  Results on my machine (Celeron 800, 394MB RAM, Win XP Prof, php 5.0.2):
  16.  
  17. php Included File: 5.17731785774
  18. Serialized file: 3.72141003609
  19. MySQL table: 4.31501793861
  20. Shared Memory: 0.0416531562805
  21.  
  22. */
  23.  
  24.  define(&#092;"_BENCH_INCLUDE\", true); // benchmark include files
  25.  define(&#092;"_BENCH_SERIALFILE\", true); // benchmark files with serialized data
  26.  define(&#092;"_BENCH_SHAREMEM\", false); // benchmark shared memory
  27.  define(&#092;"_BENCH_MYSQL\", false); // benchmark MySQL
  28.  
  29.  define(&#092;"_SQL_HOST\", \"localhost\");
  30.  define(&#092;"_SQL_USER\", \"root\");
  31.  define(&#092;"_SQL_PASS\", \"\");
  32.  define(&#092;"_SQL_DB\", \"test\");
  33.  
  34.  if(!file_exists(&#092;"testinclude.php\")) die(\"Cannot find data source\");
  35.  
  36. // timer class found on forum.php.pl - thx pingu
  37.  class timer{
  38.  
  39. var $time;
  40.  
  41. function start(){ $this->time = microtime(true); }
  42. function stop()
  43. {
  44. return (microtime( true ) - $this->time);
  45. }
  46.  
  47.  };
  48.  
  49.  $time = new timer();
  50.  
  51. // Included file benchmark
  52.  if(_BENCH_INCLUDE){
  53.  
  54.  $time->start();
  55.  for($i=0; $i<5000; $i++) include(&#092;"testinclude.php\");
  56.  echo &#092;"<b>php Included File:</b> \" . $time->stop() . \"<br>n\";
  57.  
  58.  };
  59.  
  60. // Serialized data benchmark
  61.  if(_BENCH_SERIALFILE){
  62.  
  63. // Check that serialized data file exists, if not create it
  64.  if(!file_exists(&#092;"testfile.dat\")){
  65.  
  66. include(&#092;"testinclude.php\");
  67. file_put_contents(&#092;"testfile.dat\", serialize($config));
  68.  
  69. };
  70.  
  71. // Benchmark
  72. $time->start();
  73.  for($i=0; $i<5000; $i++){ unserialize(file_get_contents(&#092;"testfile.dat\")); };
  74.  echo &#092;"<b>Serialized file:</b> \" . $time->stop() . \"<br>n\";
  75.  
  76.  };
  77.  
  78. // MySQL Benchmark
  79.  if(_BENCH_MYSQL){
  80.  
  81. mysql_connect(_SQL_HOST, _SQL_USER, _SQL_PASS);
  82.  mysql_select_db(_SQL_DB);
  83.  
  84.  $time->start();
  85.  for($i=0; $i<5000; $i++){ mysql_result(mysql_query(&#092;"SELECT cache FROM cache WHERE id=1\"), 0); };
  86.  echo &#092;"<b>MySQL table:</b> \" . $time->stop() . \"<br>n\";
  87.  
  88.  };
  89.  
  90. // Shared memory benchmark
  91.  if(_BENCH_SHAREMEM){
  92.  
  93. // Check that shared memory block exists, if not create it
  94. if(!($shnd = @shmop_open(1, &#092;"a\", 0, 0))){
  95.  
  96. $str = serialize($config);
  97. $size = sizeof($str);
  98.  
  99. if(!($shnd = shmop_open(1, &#092;"c\", 0777, 16 + $size))) die(\"Cannot use shmop func.\");
  100.  
  101. shmop_write($shnd, $size, 0);
  102. shmop_write($shnd, $str, 16);
  103.  
  104. };
  105.  
  106. shmop_close($shnd);
  107.  
  108.  $time->start();
  109.  $shnd = shmop_open(1, &#092;"a\", 0, 0);
  110.  for($i=0; $i<5000; $i++){ $size = (integer) shmop_read($shnd, 0, 16); shmop_read($shnd, 16, $size); };
  111.  echo &#092;"<b>Shared Memory:</b> \" . $time->stop() . \"<br>n\";
  112.  
  113.  shmop_delete($shnd);
  114.  
  115.  };
  116.  
  117. ?>


Plik testinclude.php
  1. <?
  2.  
  3. $config = Array(
  4.  
  5. &#092;"debug\" => true,
  6. &#092;"cache\" => false,
  7.  
  8. &#092;"panels\" => Array(
  9.  
  10. &#092;"menu\" => Array(
  11.  
  12. &#092;"use_router\" => false,
  13. &#092;"use_stack\" => false,
  14. &#092;"def_action\" => \"menu/display\"
  15.  
  16. ),
  17.  
  18. &#092;"main\" => Array(
  19.  
  20. &#092;"use_router\" => true,
  21. &#092;"use_stack\" => true,
  22. &#092;"def_path\" => \"List\"
  23.  
  24. )
  25.  
  26. )
  27.  
  28. );
  29.  
  30. ?>


Plik bench.sql
  1. CREATE TABLE `cache` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `cache` tinytext NOT NULL,
  4. PRIMARY KEY (`id`)
  5. ) TYPE=MyISAM AUTO_INCREMENT=2 ;
  6.  
  7. INSERT
  8. INTO `cache` VALUES (1, 'a:3:{s:5:"debug";b:1;s:5:"cache";b:0;s:6:"panels";a:2:{s:4:"menu";a:3:{s:10:"use_router";b:0;s:9:"use_stack";b:0;s:10:"def_action";s:12:"menu/display";}s:4:"main";a:3:{s:10:"use_router";b:1;s:9:"use_stack";b:1;s:8:"def_path";s:4:"List";}}}');


Czekam na opinie i komentarze (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Ten post edytował ShaXbee 20.01.2005, 13:18:49
Go to the top of the page
+Quote Post

Posty w temacie
- DeyV   Need for Speed, czyli rozważania dotyczące prędkości   27.01.2003, 15:54:08
- - It's_me   Jezeli chodzi o mnie to ja zawsze bylem bazodanowc...   27.01.2003, 16:21:36
- - scanner   Odkąd przerzucilem sie z plików na BD, to nie mam ...   29.01.2003, 12:03:36
- - DeyV   Jednak pojawia się pytanie: Jak daleko się posuwać...   29.01.2003, 12:21:59
- - kurtz   Re: Need for Speed, czyli rozważania dotyczące prędkości   29.01.2003, 12:32:32
- - dragossani   Prędkość liniowego odczytu danych z bazy jest zwyk...   29.01.2003, 13:29:53
- - Seth   A co sadzicie o XMLu jako pewnym zamienniku bazy d...   2.02.2003, 13:17:22
- - dragossani   Od biedy można spróbować posłużyć się XML'em jako ...   3.02.2003, 11:52:54
- - Seth   Czyli XML tylko jako wzorzec ?   3.02.2003, 12:56:08
- - dragossani   No, powiedzmy jako źródło informacji na poziomie s...   4.02.2003, 14:21:55
- - Seth   juz rozumiem   4.02.2003, 15:51:44
- - Mati   ...   14.02.2003, 01:48:37
- - Picia   Bazy pliki i inne...   17.07.2003, 17:51:34
- - Omega   W sumie pliki są bardziej powszechne... W necie o ...   17.07.2003, 17:59:34
- - e-Gandalf   Re: Bazy pliki i inne...   17.07.2003, 18:44:55
- - Omega   Z tego co wiem płatna licencja jest potrzebna gdy ...   17.07.2003, 19:16:56
- - Picia   Licencja i Widoki   17.07.2003, 19:17:14
- - borec   ja tam jestem za mysql po 1. 0.001 sek to dla mni...   19.07.2003, 12:33:01
- - e-Gandalf   Cytatpo 3. jak sie ma szybkiego serwa to tylko wyg...   19.07.2003, 12:41:43
- - squid   CytatJednak pojawia się pytanie: Jak daleko się po...   19.07.2003, 14:45:15
- - Omega   Pliki są wygodniejsze nie tylko dla mn iejszych st...   20.07.2003, 14:24:47
- - lewal   cale rozwazania tocza sie nad przewaga plikow nad ...   23.10.2003, 02:12:10
- - msulik   Jaką pamięć masz na myśli? Mówisz o shared memory ...   12.11.2003, 00:52:12
- - DaNTe   CytatZ tego co wiem płatna licencja jest potrzebna...   18.02.2004, 23:43:33
- - dooshek   Z MySQLem jest tak, ze tak na prawde jest bardzo w...   19.02.2004, 22:52:31
- - enceladus   Z doświadczenia polecam stosowanie squid-a w roli ...   20.02.2004, 00:14:10
- - halfik   CytatZ MySQLem jest tak, ze tak na prawde jest bar...   25.02.2004, 15:46:29
- - RoVeR   Ja używam plikuw *.php jako bazy i mam to co z txt...   26.02.2004, 07:27:32
- - halfik   CytatJa używam plikuw *.php jako bazy i mam to co ...   28.02.2004, 12:19:49
- - bamboos   Witam!! Ja na serverze nie mam dostępu do bazy dan...   28.02.2004, 13:05:01
- - enceladus   Tak wlasnie sobie to czytam i pomyslalem że cała d...   28.02.2004, 13:11:01
- - bigZbig   Powtorze za poprzednikiem, że nie ma sensu prowadz...   26.08.2004, 14:52:19
- - ActivePlayer   Pisalem ostatnio database_layer z automatyczną obs...   28.08.2004, 00:02:29
- - squid   Cytat(bigZbig @ 2004-08-26 15:52:19)Natomiast...   11.09.2004, 12:03:55
- - Vertical   W bazie po prostu piszesz zapytanie, a baza zwraca...   28.09.2004, 09:56:59
- - Krolik   CytatCytat Z MySQLem jest tak, ze tak na prawde je...   22.11.2004, 11:10:44
- - awides   mysql -> dane pliki cache -> buforowanie   22.11.2004, 23:02:01
- - ShaXbee   To mój pierwszy post na Forum php Pro. Oby wyszedł...   19.01.2005, 22:22:11
- - bela_666   Cytat[Error : Błąd] [404] File Not Found : Plik n...   20.01.2005, 00:43:12
- - hawk   Pomijając prostą kwestię istnienia lub nie istnien...   20.01.2005, 09:05:31
- - ShaXbee   I tu tkwi problem. Uzywam PHP5 i SimpleXML. Nieste...   20.01.2005, 13:12:52
- - hawk   Co do SimpleXML: to jest znany bug php. Workaround...   20.01.2005, 14:37:55
- - bela_666   Cytat(hawk @ 2005-01-20 14:37:55)Co do shm: a...   20.01.2005, 15:18:21
- - hawk   System plików siedzący w pamięci. Link: http://www...   20.01.2005, 17:35:11
- - Krolik   Linux automatycznie cache'uje pliki w pamieci....   21.01.2005, 13:46:16
- - squid   MySQL i pewnie inne bazy ma typ tabeli ktora przet...   21.01.2005, 23:19:45
- - NuLL   IMHO - dyskusja lekko pozbawiona sensu - trzebaby ...   22.01.2005, 17:29:25
- - awides   @squid chodzi ci pewnie o HEAP, jest jeden problem...   23.01.2005, 09:40:36
- - NuLL   Trochę odgrzeje jeśli można Co jest lepsze czyst...   8.06.2005, 22:52:45
- - bela_666   Hwao gdzieś benchmark zrobił, poszukaj   8.06.2005, 23:22:53
- - chmolu   W moich testach zapisywanie zawartości pliku ini j...   9.06.2005, 05:23:56
- - NuLL   Dzięki - u mnie też tak wynikło choć trochę nie ch...   9.06.2005, 17:08:10


Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 8.10.2025 - 20:16