Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Optymalizacja kodu. Proste sztuczki., Czyli jak, za pomocą sztuczek, łatwo zoptymalizować kod
Cezar708
post 30.11.2007, 11:09:10
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
2 Stron V   1 2 >  
Start new topic
Odpowiedzi (1 - 19)
kevinsz
post 30.11.2007, 11:45:36
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 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 winksmiley.jpg) własne sztuczki, ale na pewno będę go pilnie śledził smile.gif
Go to the top of the page
+Quote Post
Cezar708
post 30.11.2007, 12:01:52
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 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. case 'suzuki': // o ile suzuki jest japonski tongue.gif tongue.gif tongue.gif
  7. $country = 'japonia';
  8. break;
  9. default:
  10. $country = 'nie japonia';
  11. }
  12.  
  13. // gorzej:
  14. if ( $car == 'honda' || $car == 'toyota' || $car == 'suzuki' ){
  15. $country = 'japonia';
  16. } else {
  17. $country = 'nie japonia';
  18. }
  19. ?>


Ten post edytował Cezar708 30.11.2007, 12:02:36
Go to the top of the page
+Quote Post
Jojo
post 30.11.2007, 12:09:32
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 winksmiley.jpg


--------------------
Rozwój cywilizacji informatycznej to wyścig między programistami, którzy wytwarzają coraz łatwiejsze
programy użytkowe dla idiotów, a światem produkującym coraz lepszych gatunkowo idiotów.

Blog: Małolepszy.info
Go to the top of the page
+Quote Post
pafka
post 30.11.2007, 12:26:40
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 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 30.11.2007, 12:31:32
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 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 30.11.2007, 16:45:33
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 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ą winksmiley.jpg Wtedy skrypt nie musi za każdym razem używać count.
Go to the top of the page
+Quote Post
sticker
post 30.11.2007, 17:08:26
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 30.11.2007, 20:39:31
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 30.11.2007, 20:53:20
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 30.11.2007, 21:56:59
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 30.11.2007, 22:29:21
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 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? smile.gif


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
sticker
post 30.11.2007, 23:12:38
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 smile.gif po to chyba ten wątek był profilowanie


--------------------
Go to the top of the page
+Quote Post
Bastion
post 1.12.2007, 00:33:54
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 smile.gif bo to tylko wierzchołek góry lodowej Google


--------------------
Go to the top of the page
+Quote Post
pafka
post 1.12.2007, 00:51:34
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ą 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 1.12.2007, 14:54:53
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


--------------------
Pozdrawiam
Tomasz Wójcik
..:: prgTW ::..
Go to the top of the page
+Quote Post
phpion
post 1.12.2007, 15:28:24
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 1.12.2007, 15:45:25
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 smile.gif


--------------------
Pozdrawiam
Tomasz Wójcik
..:: prgTW ::..
Go to the top of the page
+Quote Post
Kreton
post 1.12.2007, 23:01:48
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. smile.gif Co innego w przykładzie, który ty podałeś. biggrin.gif
Go to the top of the page
+Quote Post
sticker
post 2.12.2007, 01:37:47
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 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
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 24.07.2025 - 19:56