Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] optymalizacja kodu, '!' kontra 'false'
Forum PHP.pl > Forum > Przedszkole
-wNogachSpisz-
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?
Noidea
Używaj wersji #1, bo jest czytelniejsza. Optymalizacja nie ma tutaj żadnego zastosowania, bo oba kody i tak działają szybko.
Mephistofeles
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ń.
-wNogachSpisz-
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..
Crozin
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.
smietek
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.
-wNogachSpisz-
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....
Crozin
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...
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.