Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] optymalizacja kodu, '!' kontra 'false', zadziwiający wynik działań optymalizacyjnych
--wNogachSpisz--
post
Post #1





Goście







Witam

Mam pytanie, który kod jest szybszy?

wersja #1:
  1. $var = array();
  2.  
  3. if ( ! is_array($array)) {
  4. echo 'error';
  5. }


wersja #2:
  1. $var = array();
  2.  
  3. if ( false === is_array($array)) {
  4. echo 'error';
  5. }


Gdyby ktoś mnie spytał, bez zastanowienia odpowiedziałbym, że wersja #2, okazuje się że nie koniecznie, na platformie windows otrzymuje wynik dokładnie przeciwny.
Wersja #1 jest SZYBSZA od #2,
Na platformie linux wyniki testu są identyczne.

Wygląda na to, że w niektórych przypadkach "!" może być równie szybkie LUB SZYBSZE od "=== false".
Nie wiem w którą stronę iść chcąc optymalizować kod...

Co o tym myślcie?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
Noidea
post
Post #2





Grupa: Zarejestrowani
Postów: 226
Pomógł: 61
Dołączył: 20.08.2010

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


Używaj wersji #1, bo jest czytelniejsza. Optymalizacja nie ma tutaj żadnego zastosowania, bo oba kody i tak działają szybko.


--------------------
Go to the top of the page
+Quote Post
Mephistofeles
post
Post #3





Grupa: Zarejestrowani
Postów: 1 182
Pomógł: 115
Dołączył: 4.03.2009
Skąd: Myszków

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


Daj sobie spokój z takim "optymalizowaniem". Optymalizacja to w małej mierze problem samego kodu, optymalizacja polega na stosowaniu jak najszybszych algorytmów, cache'owaniu wyników, unikaniu niepotrzebnych działań.
Go to the top of the page
+Quote Post
--wNogachSpisz--
post
Post #4





Goście







Cytat(Noidea @ 4.02.2011, 10:43:32 ) *
Używaj wersji #1, bo jest czytelniejsza. Optymalizacja nie ma tutaj żadnego zastosowania, bo oba kody i tak działają szybko.


Nie.
Będę używał szybszego sposobu.
Wg mnie programowanie polega między innymi nad znalezieniem złotego środka między czytelnością kodu a jego szybkością, jestem gotów poświęcić akurat tą konkretną odrobinę czytelności na rzecz wydajności, przede wszystkim dlatego, że uważam, że 'false ===' nie jest mniej czytelne od '!' a tylko dłuższe w zapisie...

Cytat(Mephistofeles @ 4.02.2011, 15:12:47 ) *
Daj sobie spokój z takim "optymalizowaniem". Optymalizacja to w małej mierze problem samego kodu, optymalizacja polega na stosowaniu jak najszybszych algorytmów, cache'owaniu wyników, unikaniu niepotrzebnych działań.


Nie.
To o czym opowiadasz to optymalizacja na poziomie logiki aplikacji.
Natomiast ja mówie o optymalizacji na poziomie składni kodu.
To osobne dziedziny optymalizacji i prosze Cię drogi uzytkowniku "Mephistofeles" żebyś ich więcej nie mylił i nie mieszał...


Serdecznie prosze o kolejne wypowiedzi, jak to możliwe że "!" jest szybsze od "false ===", czy optymalizator rozpozaje że negacja stoi obok fukcji jądra i nie dokonuje już przyrównania typów danych?
Innej odpowiedzy nie widze..
Go to the top of the page
+Quote Post
Crozin
post
Post #5





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Jeżeli różnica w wydajności "!xxx" i "xxx === false" ma dla Ciebie znaczenie to dlaczego piszesz w PHP, które samo w sobie jest wolne. A jakbyś przeglądnął sobie jego źródła i zobaczył ile tam jest zbędnych i "niewydajnych" operacji to byś się pewnie popłakał.

To co próbujesz tutaj zrobić to nawet nie jest mikrooptymalizacja... to już jest po prostu marnotrawstwo czasu, bo zyskasz 0.00000001 sek. w skrypcie który wykonuje się przykładowo 0.3 sek. - naprawdę optymalizacja tego jest właśnie potrzebna.

Cytat
Wg mnie programowanie polega między innymi nad znalezieniem złotego środka między czytelnością kodu a jego szybkością
Nie. Programowanie to zmuszenie maszyny do zwrócenia żądanych wyników na podstawie danych wejściowych. Tyle.
Cytat
jestem gotów poświęcić akurat tą konkretną odrobinę czytelności na rzecz wydajności
Nic tej wydajności nie zyskujesz na czymś takim.
Cytat
To o czym opowiadasz to optymalizacja na poziomie logiki aplikacji.
Natomiast ja mówie o optymalizacji na poziomie składni kodu.
To osobne dziedziny optymalizacji i prosze Cię drogi uzytkowniku "Mephistofeles" żebyś ich więcej nie mylił i nie mieszał...
Ale zdajesz sobie sprawę, że ta pierwsza odpowiedzialna jest za 99% wydajności, a druga ma takie znaczenie w tym aspekcie jak ilość kurzu na rowerze na czas przejazdu kolarza?
Cytat
Serdecznie prosze o kolejne wypowiedzi, jak to możliwe że "!" jest szybsze od "false ==="
  1. ZEND_API int boolean_not_function(zval *result, zval *op1 TSRMLS_DC) /* {{{ */
  2. {
  3. zval op1_copy;
  4.  
  5. zendi_convert_to_boolean(op1, op1_copy, result);
  6. ZVAL_BOOL(result, !Z_LVAL_P(op1));
  7. return SUCCESS;
  8. }
  1. ZEND_API int is_identical_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ */
  2. {
  3. Z_TYPE_P(result) = IS_BOOL;
  4. if (Z_TYPE_P(op1) != Z_TYPE_P(op2)) {
  5. Z_LVAL_P(result) = 0;
  6. return SUCCESS;
  7. }
  8. switch (Z_TYPE_P(op1)) {
  9. case IS_NULL:
  10. Z_LVAL_P(result) = 1;
  11. break;
  12. case IS_BOOL:
  13. case IS_LONG:
  14. case IS_RESOURCE:
  15. Z_LVAL_P(result) = (Z_LVAL_P(op1) == Z_LVAL_P(op2));
  16. break;
  17. case IS_DOUBLE:
  18. Z_LVAL_P(result) = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
  19. break;
  20. case IS_STRING:
  21. Z_LVAL_P(result) = ((Z_STRLEN_P(op1) == Z_STRLEN_P(op2))
  22. && (!memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1))));
  23. break;
  24. case IS_ARRAY:
  25. Z_LVAL_P(result) = zend_hash_compare(Z_ARRVAL_P(op1), Z_ARRVAL_P(op2), (compare_func_t) hash_zval_identical_function, 1 TSRMLS_CC)==0;
  26. break;
  27. case IS_OBJECT:
  28. if (Z_OBJ_HT_P(op1) == Z_OBJ_HT_P(op2)) {
  29. Z_LVAL_P(result) = (Z_OBJ_HANDLE_P(op1) == Z_OBJ_HANDLE_P(op2));
  30. } else {
  31. Z_LVAL_P(result) = 0;
  32. }
  33. break;
  34. default:
  35. Z_LVAL_P(result) = 0;
  36. return FAILURE;
  37. }
  38. return SUCCESS;
  39. }
Taka może być różnica. Definicji wszystkich mark nie chce mi się podawać.

Nie ma żadnej różnicy wartej uwagi pomiędzy oboma zapisami. A jeżeli twierdzisz, że jest to proszę podaj sposób w jaki mierzyłeś ową różnicę oraz różnicę samą w sobie.
Go to the top of the page
+Quote Post
smietek
post
Post #6





Grupa: Zarejestrowani
Postów: 306
Pomógł: 32
Dołączył: 20.01.2008

Ostrzeżenie: (20%)
X----


O ile dobrze pamiętam, to najszybszą metodą na sprawdzanie czy tablica jest tablicą (podany w komentarzach na php.net i wg. właśnie tych osób przesiadujących tam) jest:

  1. if((array)$array === $array){
  2. //kod
  3. }


Ale nie sprawdzałem. Może ktoś się pokusi o teścik.

Ten post edytował smietek 4.02.2011, 21:51:33


--------------------
Go to the top of the page
+Quote Post
--wNogachSpisz--
post
Post #7





Goście







Cytat(Crozin @ 4.02.2011, 21:47:00 ) *
Jeżeli różnica w wydajności "!xxx" i "xxx === false" ma dla Ciebie znaczenie to dlaczego piszesz w PHP, które samo w sobie jest wolne. A jakbyś przeglądnął sobie jego źródła i zobaczył ile tam jest zbędnych i "niewydajnych" operacji to byś się pewnie popłakał.

Pisze w php, gdyż jest on interpretowany przez największą ilość hostingów www.
Dzięki temu mam możliwość uruchomienia mojego softu na ogromnej ilości maszyn co jest absolutnie niewykonalne w przypadku każdego innego jezyka.
Zadję sobie sprawę, że php jest najwolniejszy z wolnych.
Fakt ten nie sprawia że optymalizacja jest bezcelowa, wręcz przeciwnie.

Cytat(Crozin @ 4.02.2011, 21:47:00 ) *
To co próbujesz tutaj zrobić to nawet nie jest mikrooptymalizacja... to już jest po prostu marnotrawstwo czasu, bo zyskasz 0.00000001 sek. w skrypcie który wykonuje się przykładowo 0.3 sek. - naprawdę optymalizacja tego jest właśnie potrzebna.

Zgadzam się, mikooptymalizacja czy nanooptymalizacja to dobry termin określający to co tutaj opisuje.
Marnotractwo czasu to to nie jest, przeciwnie, każde zwiększenie szybkości programu to krok w dobrym kierunku, a ja chce kroczyć w dobrym kierunku.

Cytat(Crozin @ 4.02.2011, 21:47:00 ) *
Nie. Programowanie to zmuszenie maszyny do zwrócenia żądanych wyników na podstawie danych wejściowych. Tyle.

Doprawdy? W takim razie wszyscy powinniśmy zacząć pisać w kodzie maszynowym, albo w druga stronę, do najprostrzej operacji jak np. "print 'hello world'" includować wszystkie bibltieki PEAR.
Podajesz pełna definicję programowania, ma się ona nijak do kwestii które tutaj omawiamy, czyli wyboru lepszej składni kodu. Odpuść sobie.

Cytat(Crozin @ 4.02.2011, 21:47:00 ) *
Nic tej wydajności nie zyskujesz na czymś takim.

Kwestia otwarta, zyskam? nie zyskam? ile zyskam?

Cytat(Crozin @ 4.02.2011, 21:47:00 ) *
Ale zdajesz sobie sprawę, że ta pierwsza odpowiedzialna jest za 99% wydajności, a druga ma takie znaczenie w tym aspekcie jak ilość kurzu na rowerze na czas przejazdu kolarza?

I ponownie, zajmujemy się w tym temacie kwestią optymalizacji składni, jeśli chcesz porozmawiać o błędach logicznych, zapraszam do innego topicu.

Cytat(Crozin @ 4.02.2011, 21:47:00 ) *
Nie ma żadnej różnicy wartej uwagi pomiędzy oboma zapisami. A jeżeli twierdzisz, że jest to proszę podaj sposób w jaki mierzyłeś ową różnicę oraz różnicę samą w sobie.

Jest i to znacząca na korzyść "!", co mnie dziwi bo "false ===" winno być szybsze.

Za chwilkę wrzuce kod którym sprawdzam wydajność, chwilunia....
Go to the top of the page
+Quote Post
Crozin
post
Post #8





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Cytat
Marnotractwo czasu to to nie jest, przeciwnie, każde zwiększenie szybkości programu to krok w dobrym kierunku, a ja chce kroczyć w dobrym kierunku.
Nie, to sztuka dla sztuki. Tracisz masę czasu który mógłbyś przeznaczyć na coś wartościowego, nie zyskujesz kompletnie nic.
Cytat
Doprawdy? W takim razie wszyscy powinniśmy zacząć pisać w kodzie maszynowym, albo w druga stronę, do najprostrzej operacji jak np. "print 'hello world'" includować wszystkie bibltieki PEAR.
Nie wiem jak udało Ci się dojść do takich wniosków, naprawdę nie wiem.
Cytat
Kwestia otwarta, zyskam? nie zyskam? ile zyskam?
Kwestia zamknięta. Nie zyskujesz niczego wartego uwagi.
Cytat
I ponownie, zajmujemy się w tym temacie kwestią optymalizacji składni, jeśli chcesz porozmawiać o błędach logicznych, zapraszam do innego topicu.
O jakich Ty błędach logicznych piszesz? Optymalizacja to przede wszystkim znalezienie sposobu na zwrócenie takich samych danych w krótszym czasie czy zużywając mniej zasobów. Logika nie ma tu absolutnie nic do rzeczy...
Go to the top of the page
+Quote Post

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: 21.08.2025 - 08:21