Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: optymalizacja skryptow
Forum PHP.pl > Forum > PHP
Majcok12
Witam!
Mam kilka pytan odnosnie optymalizacji kodu php. Chcialem sie spytac o jakies porady dot. zoptymalizownia kodu, bo imo moje skryptu do najszybszych nie naleza. A i jeszcze takie pytanko. Co bedzie szybsze? miec jedna tabele 'comments' i w niej wszystko komentarze, do wszystkiego (obrazkow, newsow, artow, sondy itp.) czy do newsow osobna tabele np. news_comments, do plikow tez inna, i tak dalej. Bo wlasnie nie wiem co zrobic, moim zdaniem szybsze byloby to drugie roziwazanie (mniej rekordow do przeszukiwania), ale wole sie spytac was o zdanie i druga podobna sprawa, co jest szybsze ?
  1. <?
  2. $zawartosc = mysql_fetch_array($result);
  3. $id_artykulu = $zawartosc['0'];
  4. ?>

czy
  1. <?
  2. $zawartosc = mysql_fetch_array($result);
  3. $id_artykulu = $zawartosc[&#092;"art_num\"];
  4. ?>


Dzieki
Pozdr
vieri_pl
Myslę że osobne tabelę dla komentarzy to lepszy pomysł ponieważ jest mniej rekordów do pobrania, a co do przykładów to raczej ie różnią się one szybkością...
Majcok12
ok dzieki. i mam jeszcze jedno pytanie. co jest szybsze, gdy nie wiadomo ile elementow ma jakas tablica (inaczej mowiac ile razy ma sie petla wykonac), uzycie foreach, czy zliczenie count() ilosc elementow i pozniej petla for?
mike
foreach jest szybszy od zwykłaego for'a, w końcu jest zaprojektowany specjalnie do obsługi tablic.

A co do tabel.
Jeżeli komentarze do tych wszystkich rzeczy są semantycznie takie same (tytuł,treść,data,podpis, czy jakoś tam) to z perspektywy projektowania baz damych powinno sie trzymać je w jednej tabeli a nie w kilku.
Majcok12
struktura kazdej bedzie taka sama, ale jesli stworzenie kilku moze przyspieszyc strone to jednak wole zrobic kilka tabel, a nie jedna
Jim
Moim zdaniem lepiej jest stworzyc jedna tabele. Dla kilku tabel bedziesz musial dodawac osobne SELECTY albo dodatkowe ify tudziez case. Wiecej kodu - wiecej czasu na wykonanie skryptu.
Z 1 tabela to bedzie sie zmienial tylko parametr rodzaju komentarza np
1-dla plikow
2-dla newsow
itp.

A to, ze bedziesz mial duzo rekordow w jednej tabeli, zacznie miec znaczenie jak tych komentarzy bedzie juz naprawde duuuzo.

takze jestem za 1 tabela winksmiley.jpg
mike
Kilka tabel jest najgorszym wyjściem, ponieważ przeszukiwanie dużej tabeli jest lepsze od wykonywania kilku zapytań na mniejszych tabelach. A poza tym skoro komentarze sa takie same (składniowo) to powinny być trzymane w jednej tabeli.
Szybkośc skryptu nie gra tutaj roli, bo nie zaoszczędzimy tutaj wiele, ale chodfzi o fakt poprawnego merytorycznie zaprojektowania bazy danych.
A klika tebael jest złe.
FiDO
Cytat(mike_mech @ 2005-08-05 19:05:44)
foreach jest szybszy od zwykłaego for'a, w końcu jest zaprojektowany specjalnie do obsługi tablic.

A sprawdzales? Bo ja tak i wyniki mowia same za siebie.

Legenda:

count - for ($i = 0; $i < count($loop); $i++)
foreach - foreach ($loop as $v)
isset - for($i = 0; isset($loop[$i]); $i++)
size - for ($i = 0, $n = count($loop); $i < $n; $i++)
while - while (list($k, $v) = each($loop))

Wyniki sa powtarzalne.
Majcok12
aha i zapomnialbym czy istnieje pomiedzy tym

  1. <?
  2. echo &#092;"<a href=\"articles.php?id=$id_artykulu&action=edit_art\"><img border=\"0\" src='$edit_img_src'> </a> <a href=\"articles.php?art_id=$id_artykulu&action=del_art\"><img border=\"0\" src='$delete_img_src'> </a>\";
  3. ?>


a tym


  1. <a href=\"articles.php?id=<? echo $id_artykulu; ?>&action=edit_art\"><img border=\"0\" src='<? echo $edit_img_src; ?>'> </a>
  2. <a href=\"articles.php?art_id=<? echo $id_artykulu; ?>&action=del_art\"><img border=\"0\" src='<? echo $delete_img_src; ?>'> </a>


jaka roznica w szybkosci wyswietlania ? bo nie wiem czy zmieniac to (w wypadu wiecej html nie generuje go przy uzyciu echo)
Jim
w szybkosci działania nie ma żadnej różnicy. ale jest różnica w estetyce pisania skryptów. ja bym to tak napisał:

  1. <?
  2. echo '<a href=\"articles.php?id=$id_artykulu&action=edit_art\"><img border=\"0\" src=\"$edit_img_src\"></a> 
  3. <a href=\"articles.php?art_id=$id_artykulu&action=del_art\"><img border=\"0\" src=\"$delete_img_src\"></a>';
  4. ?>
ActivePlayer
  1. <?
  2. $zawartosc = mysql_fetch_array($result);
  3. $id_artykulu = $zawartosc['0'];
  4. ?>

czy
  1. <?
  2. $zawartosc = mysql_fetch_array($result);
  3. $id_artykulu = $zawartosc[&#092;"art_num\"];
  4. ?>

odpowiedz
  1. <?
  2. $zawartosc = mysql_fetch_row($result);
  3. $id_artykulu = $zawartosc[0];
  4. ?>


uzywaj ' zamiast "

jesli piszesz:
  1. <?php
  2. echo &#092;"$asd\";
  3. ?>

to wynikiem bedzie zawartosc zmiennej $asd
jesli napiszesz
  1. <?php
  2. echo '$asd';
  3. ?>

to wynikiem bedzie
Kod
$asd

Jim, post nademna zle napisał.

Cytat
moim zdaniem szybsze byloby to drugie roziwazanie (mniej rekordow do przeszukiwania)

Poczytaj o indexach mysqla

Nie uzywaj 'SELECT * ..', pobieraj tylko to czego potrzebujesz

FiDO - bardzo fajny benchmark. Człowiek uczy sie całe życie.
tak czy siak i tak bede uzywac foreach'a dla moich tablic o size ~~20. a czasem nawet 100. Znikoma różnica. Większych sie raczej nie uzywa, przynajmniej żadko.
Jim
Cytat(ActivePlayer @ 2005-08-06 21:45:07)
jesli piszesz:
  1. <?php
  2. echo &#092;"$asd\";
  3. ?>

to wynikiem bedzie zawartosc zmiennej $asd
jesli napiszesz
  1. <?php
  2. echo '$asd';
  3. ?>

to wynikiem bedzie
Kod
$asd

worriedsmiley.gif
nawet o tym nie wiedzialem bo zwykle uzywam innej skladni
Kod
"<table><tr><td>" . $txt . "</td></tr></table>"

przepraszam za ewentualne wprowadzenie kogos w blad.
ActivePlayer
  1. <?php
  2.  
  3. echo '<table><tr><td>'. $txt . '</td></tr></table>';
  4.  
  5. ?>

tak jest wydajniej.. parser php nie musi przeszukiwac stringa, w celu odnalezienia nazw zmiennych.
mike
Cytat(FiDO @ 2005-08-06 02:41:30)
Cytat(mike_mech @ 2005-08-05 19:05:44)
foreach jest szybszy od zwykłaego for'a, w końcu jest zaprojektowany specjalnie do obsługi tablic.

A sprawdzales? Bo ja tak i wyniki mowia same za siebie.

Legenda:

count - for ($i = 0; $i < count($loop); $i++)
foreach - foreach ($loop as $v)
isset - for($i = 0; isset($loop[$i]); $i++)
size - for ($i = 0, $n = count($loop); $i < $n; $i++)
while - while (list($k, $v) = each($loop))

Wyniki sa powtarzalne.

Faktycznie. Chylę czoła.

Ale ... żadnym z powyższych sposobów nie przejdziesz po tablicy o np. takich indeksach: 1,2,5,6,7,10,12,56,57,58,59,100, ... ani po tablicy asocjacyjnej.

Więc pomimo że w, bądź co bądź, specyficznych sytuacjach foreach() nie jest najszybszy, to jednak zawsze najbardziej funkcjonalny i elastyczny.

Ale i tak benchmarki ciekawe i kształcące winksmiley.jpg
FiDO
Cytat
Ale ... żadnym z powyższych sposobów nie przejdziesz po tablicy o np. takich indeksach: 1,2,5,6,7,10,12,56,57,58,59,100, ... ani po tablicy asocjacyjnej.

No wlasnie zapomnialem napisac, ze to sie tyczy tylko "zwyklych" tablic smile.gif. Do asocjacyjnych oczywiscie trzeba uzyc foreach'a, chociaz ... musze cos sprawdzic jeszcze ;]

edit:
Tak cos czulem.. mozna jeszcze tak:
$keys = array_keys($loop);
for ($i = 0, $n = count($keys); $i < $n; $i++) {

i jest to ok 20% szybsze niz foreach, ale ze wzgledu na mocno zmniejszona czytelnosc nie ma sensu sie w to bawic.
mike
Cytat(FiDO @ 2005-08-07 21:15:28)
(...) musze cos sprawdzic jeszcze ;]

Kiedys widzialem jeszcze jedną konstrukcję, podobno bardzo szybką, ale za cholere nie moge sobie przypomnieć jak to szło.

Wyglądało to mniej więcej tak:
  1. <?php
  2.  
  3. $arrTab = array( 'tutaj jakieś pierdoły, także asocjacyjnie' );
  4.  
  5. for( reset( $arrTab );; next( $arrTab ) )
  6. {
  7. echo key( $arrTab) . ' - ' . current( $arrTab );
  8. }
  9.  
  10. ?>

no i nie pamietam co było w srodku :/ i nie pamietam gdzie to widzialem.
Ale pamietam że mówili że jest bardzo szybkie.

Ach ta skleroza winksmiley.jpg
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.