Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> Optymalizacja kodu. Proste sztuczki., Czyli jak, za pomocą sztuczek, łatwo zoptymalizować kod
Cezar708
post
Post #1





Grupa: Zarejestrowani
Postów: 1 116
Pomógł: 119
Dołączył: 10.05.2005
Skąd: Poznań

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


Witam,

Proponuję podzielić się pomysłami na szybkie optymalizacje kodu za pomocą sztuczek:

na początek:
  1. <?php
  2. // do sprawdzania, czy istnieje element w tablicy:
  3. $cars = array( "bmw", "fiat", "volvo", "honda", ... );
  4.  
  5. // zamiast 
  6. if ( in_array('honda', $cars) ){ // ... 
  7.  
  8. // szybciej działa
  9. if ( isset($cars['honda'] ){ // ponieważ isset to nie funkcja tylko konstrukcja języka PHP
  10. ?>


podobnie:
  1. <?php
  2. // zamiast 
  3. if ( strlen( $md5string ) <= 32 ) { //....
  4.  
  5. // szybciej działa:
  6. if ( !isset( $md5string{32} ) ) { // wyjaśnienie jak wyżej
  7. ?>


trochę z innej beczki:
  1. <?php
  2. // zamiast 
  3. include( "skrypt.php" );
  4.  
  5. // szybciej działa
  6. include( "./skrypt.php" ); // ponieważ nie szuka w `include_path`
  7. ?>


lub
  1. <?php
  2. // zamiast 
  3. $i++;
  4.  
  5. // szybciej działa:
  6. ++$i; // ponieważ parser nie tworzy zmiennej tymczasowej
  7. ?>


.. macie jakieś sztuczki, którymi chcecie się podzielić?
Go to the top of the page
+Quote Post
kevinsz
post
Post #2





Grupa: Zarejestrowani
Postów: 23
Pomógł: 2
Dołączył: 26.04.2007

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


Cytat(Cezar708 @ 30.11.2007, 11:09:10 ) *
Witam,

Proponuję podzielić się pomysłami na szybkie optymalizacje kodu za pomocą sztuczek:

na początek:
  1. <?php
  2. // do sprawdzania, czy istnieje element w tablicy:
  3. $cars = array( "bmw", "fiat", "volvo", "honda", ... );
  4.  
  5. // zamiast 
  6. if ( in_array('honda', $cars) ){ // ... 
  7.  
  8. // szybciej działa
  9. if ( isset($cars['honda'] ){ // ponieważ isset to nie funkcja tylko konstrukcja języka PHP
  10. ?>


Zaraz, zaraz... Przecież powyższe konstrukcje sprawdzają coś innego. in_array sprawdza, czy istnieje wartość 'honda' w tablicy $cars, a isset sprawdza czy istnieje element tablicy $cars o kluczu 'honda'. To nie jest to samo (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Sam temat uważam za ciekawy, niestety w chwili obecnej nie mam za wiele czasu, aby wprowadzić (i pomyśleć, czy takie mam (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) ) własne sztuczki, ale na pewno będę go pilnie śledził (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Cezar708
post
Post #3





Grupa: Zarejestrowani
Postów: 1 116
Pomógł: 119
Dołączył: 10.05.2005
Skąd: Poznań

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


Ups... fakt, pospieszyłem się trochę (a miało to być zachęcenie (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) )

powinno być:
  1. <?php
  2. $cars = array( "bmw"=>'1', "fiat"=>'12', "volvo"=>'312', "honda"=>'123', ... );
  3. // zamiast 
  4. if ( array_key_exists('honda', $cars) ){ // ... 
  5. // szybciej działa
  6. if ( isset($cars['honda'] ){
  7. ?>


inne przykłady, oczywiście lepiej
  1. <?php
  2. $count = count($arr);
  3. for( $i=0; $i<$count; $i++){//
  4. ?>

zamiast
  1. <?php
  2. for( $i=0; $i<count($arr); $i++){//
  3. ?>


lub
  1. <?php
  2. // lepiej 
  3. switch ( $car ){
  4. case 'honda':
  5. case 'toyota':
  6. $country = 'japonia';
  7. break;
  8. default:
  9. $country = 'nie japonia';
  10. }
  11.  
  12. // gorzej:
  13. if ( $car == 'honda' || $car == 'toyota' || $car == 'suzuki' ){
  14. $country = 'japonia';
  15. } else {
  16. $country = 'nie japonia';
  17. }
  18. ?>


Ten post edytował Cezar708 30.11.2007, 12:02:36
Go to the top of the page
+Quote Post
Jojo
post
Post #4





Grupa: Zarejestrowani
Postów: 405
Pomógł: 1
Dołączył: 19.09.2003
Skąd: Lublin

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


Cytat(Cezar708 @ 30.11.2007, 12:01:52 ) *
  1. <?php
  2. $count = count($arr);
  3. for( $i=0; $i<$count; $i++){//
  4. ?>

We wcześniejszym poście piszesz o używaniu ++$i zamiast $i++, a w tym przykładzie nadal używasz $i++. Trochę konsekwencji (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
pafka
post
Post #5





Grupa: Zarejestrowani
Postów: 33
Pomógł: 1
Dołączył: 8.01.2005

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


Cytat(Cezar708 @ 30.11.2007, 12:01:52 ) *
  1. <?php
  2. $count = count($arr);
  3. for( $i=0; $i<$count; $i++){//
  4. ?>


mozesz to zapisac jeszcze krocej (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

  1. <?php
  2. for( $i=0, $count = count($arr); $i<$count; $i++){//
  3. ?>
Go to the top of the page
+Quote Post
Cezar708
post
Post #6





Grupa: Zarejestrowani
Postów: 1 116
Pomógł: 119
Dołączył: 10.05.2005
Skąd: Poznań

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


Cytat(Jojo @ 30.11.2007, 12:09:32 ) *
We wcześniejszym poście piszesz o używaniu ++$i zamiast $i++, a w tym przykładzie nadal używasz $i++. Trochę konsekwencji (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)


Szczerze mówiąc zainteresowało mnie, czy czasem parser sam nie optymalizuje takiej pętli. Okazało się, że tak (z resztą sam sprawdziłem), czyli:
  1. <?php
  2. for( $i=0; $i<$count; $i++){ //.. 
  3. // działa tak samo szybko jak 
  4. for( $i=0; $i<$count; ++$i){ //..
  5. ?>


oczywiście zasada ta nie dotyczy pre- i postinkrementacji w samym kodzie
Go to the top of the page
+Quote Post
NetJaro
post
Post #7





Grupa: Zarejestrowani
Postów: 475
Pomógł: 0
Dołączył: 1.04.2005
Skąd: Warszawa

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


Cytat(pafka @ 30.11.2007, 12:26:40 ) *
mozesz to zapisac jeszcze krocej (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

  1. <?php
  2. for( $i=0, $count = count($arr); $i<$count; $i++){//
  3. ?>

Tylko tutaj własnie chodzi by obliczać to przed pętlą (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Wtedy skrypt nie musi za każdym razem używać count.
Go to the top of the page
+Quote Post
sticker
post
Post #8





Grupa: Zarejestrowani
Postów: 611
Pomógł: 19
Dołączył: 28.02.2005
Skąd: Wrocław

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


  1. <?php
  2. // zamiast 
  3. $i++;
  4.  
  5. // szybciej działa:
  6. ++$i; // ponieważ parser nie tworzy zmiennej tymczasowej
  7. ?>


a skad masz takie informacje? Tak z ciekawości pytam bo nie wydaje mi sie żebyś miał racje, ale nie zagłębiałem sie w działanie parsera php wiec moge sie mylić
Go to the top of the page
+Quote Post
Jabol
post
Post #9





Grupa: Przyjaciele php.pl
Postów: 1 467
Pomógł: 13
Dołączył: 22.02.2003

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


Cytat(sticker @ 30.11.2007, 18:08:26 ) *
  1. <?php
  2. // zamiast 
  3. $i++;
  4.  
  5. // szybciej działa:
  6. ++$i; // ponieważ parser nie tworzy zmiennej tymczasowej
  7. ?>


a skad masz takie informacje? Tak z ciekawości pytam bo nie wydaje mi sie żebyś miał racje, ale nie zagłębiałem sie w działanie parsera php wiec moge sie mylić

To jest logiczne. Wynika z semantyki powyższych wyrażeń.
Go to the top of the page
+Quote Post
sticker
post
Post #10





Grupa: Zarejestrowani
Postów: 611
Pomógł: 19
Dołączył: 28.02.2005
Skąd: Wrocław

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


Wcale z tego nie wynika, drzewo budowane jest na podstawie wyrażeń pasujących leksemów napotkanych przez parser w trakcie analizy. To czy jest post czy pre inkrementacja nie zmienia tutaj nic oprócz zapisu w drzewie i żadne tymczasowe zmienne nie są tworzone. Poza tym w każdym z języków programowania obie te operacje odbywają w czasie 1u i są niepodzielne. No wiec dlatego spytałem skąd takie informacje masz pokaż źródło prosze
Go to the top of the page
+Quote Post
Kreton
post
Post #11





Grupa: Zarejestrowani
Postów: 345
Pomógł: 3
Dołączył: 20.02.2005

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


Czyżby temat zaczerpnięty z http://www.jarzebski.pl/read/optymalizacja-php.so ?
Go to the top of the page
+Quote Post
nospor
post
Post #12





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Tylko tutaj własnie chodzi by obliczać to przed pętlą winksmiley.jpg Wtedy skrypt nie musi za każdym razem używać count.
To, ze count() jest w for nie znaczy ze jest za kazdym razem wyliczane. Polecam lekture manuala. Wszystko zalezy w ktorym miejscu tego for jest (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Cytat
Rownie dobrze mozna powiedziec ze twoj link plagiatuje ten: http://blog.i64.pl/BlogPio/200611/30-optymalizacja-kodu-php/
No, przyznawać sie, kto od kogo bierze? (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
sticker
post
Post #13





Grupa: Zarejestrowani
Postów: 611
Pomógł: 19
Dołączył: 28.02.2005
Skąd: Wrocław

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


a ja dodam to (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) po to chyba ten wątek był profilowanie
Go to the top of the page
+Quote Post
Bastion
post
Post #14





Grupa: Zarejestrowani
Postów: 505
Pomógł: 0
Dołączył: 8.01.2005

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


@Nospor : do podejrzanych należy dodać :

http://ilia.ws/archives/12-PHP-Optimization-Tricks.html
http://reinholdweber.com/?p=3

i pewnie jeszcze kilkunastu (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) bo to tylko wierzchołek góry lodowej Google
Go to the top of the page
+Quote Post
pafka
post
Post #15





Grupa: Zarejestrowani
Postów: 33
Pomógł: 1
Dołączył: 8.01.2005

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


Cytat(NetJaro @ 30.11.2007, 16:45:33 ) *
Tylko tutaj własnie chodzi by obliczać to przed pętlą (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Wtedy skrypt nie musi za każdym razem używać count.


zwroc uwage ze NIE podalem tego w postaci

  1. <?php
  2. for( $i=0; $i< count($arr); $i++)
  3. ?>


tylko

  1. <?php
  2. for( $i=0, $count = count($arr); $i<$count; $i++)
  3. ?>

gdzie wartosci zmienne $i=0, $count sa wyliczane jeden raz przed rozpoczeciem petli
Go to the top of the page
+Quote Post
prgTW
post
Post #16





Grupa: Zarejestrowani
Postów: 62
Pomógł: 3
Dołączył: 10.09.2004
Skąd: Warszawa

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


++$i:
miejsce w pamięci najpierw jest inkrementowane a potem jego wartość zwracana

$i++
najpierw tworzona jest kopia zmiennej i celem zapamietania wartości przed inkrementacją, faktyczna zmienna i jest inkrementowana (tracony czas pamiec na stworzenie kopii zmiennej)

$x = ++$i; (doda 1 i zwroci wynik po dodaniu - raz dodaje, raz zwraca)
$x = $i++ (stworzy kopie $i, zwroci jej wartosc do $x, potem dopiero doda 1 - zwiekszy chwilowo zuzycie pamieci i zabierze takt(y) procesora na stworzenie kopii $i);

  1. <?php
  2. for($i = 0, $count = count($arr); $i < $count; ++$i)
  3. ?>

Najkrocej napisane i najbardziej optymalne (a nie chcac nic pominac proponuje rowniez zadeklarowac zmienne $i i $count zebybyly odpowiedniego typu, np. jak $arr ma 200 kluczy to lepiej typ unsigned char niz domyslny int)

Ten post edytował prgTW 1.12.2007, 14:59:04
Go to the top of the page
+Quote Post
phpion
post
Post #17





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Cytat(prgTW @ 1.12.2007, 16:54:53 ) *
a nie chcac nic pominac proponuje rowniez zadeklarowac zmienne $i i $count zebybyly odpowiedniego typu, np. jak $arr ma 200 kluczy to lepiej typ unsigned char niz domyslny int

W jaki sposób chcesz zrealizować swój pomysł w PHP?
Go to the top of the page
+Quote Post
prgTW
post
Post #18





Grupa: Zarejestrowani
Postów: 62
Pomógł: 3
Dołączył: 10.09.2004
Skąd: Warszawa

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


Aaa, sorry, siedze i pisze program w c++ i stąd ta pomyłka. PHP ma dynamiczny typ danych, więc sorki (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Kreton
post
Post #19





Grupa: Zarejestrowani
Postów: 345
Pomógł: 3
Dołączył: 20.02.2005

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


Cytat
Rownie dobrze mozna powiedziec ze twoj link plagiatuje ten: http://blog.i64.pl/BlogPio/200611/30-optymalizacja-kodu-php/
No, przyznawać sie, kto od kogo bierze?


Ale spójrz, w podanym przeze mnie linku mamy 3 przykłady, które są identyczne jak w tym temacie. (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Co innego w przykładzie, który ty podałeś. (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post
sticker
post
Post #20





Grupa: Zarejestrowani
Postów: 611
Pomógł: 19
Dołączył: 28.02.2005
Skąd: Wrocław

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


Cytat(prgTW @ 1.12.2007, 14:54:53 ) *
++$i:
miejsce w pamięci najpierw jest inkrementowane a potem jego wartość zwracana

$i++
najpierw tworzona jest kopia zmiennej i celem zapamietania wartości przed inkrementacją, faktyczna zmienna i jest inkrementowana (tracony czas pamiec na stworzenie kopii zmiennej)

$x = ++$i; (doda 1 i zwroci wynik po dodaniu - raz dodaje, raz zwraca)
$x = $i++ (stworzy kopie $i, zwroci jej wartosc do $x, potem dopiero doda 1 - zwiekszy chwilowo zuzycie pamieci i zabierze takt(y) procesora na stworzenie kopii $i);

nie no prosze Cie ..... wiesz co to architektura komupterów, prof. Biernat i sumator? podaj fakty dlaczego i gdzie tak napisane.
- jak napisałem te operajce da sie wykonać w 1 takcie cyklu procesora, myle sie ?
- jedyny problem może wynikać z budowy drzewa parsera ale to zaraz na google znajde moze (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Ten post edytował sticker 2.12.2007, 01:53:47
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 25.08.2025 - 06:45