![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Przyjaciele php.pl Postów: 195 Pomógł: 0 Dołączył: 7.07.2003 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Fragment wydzielony z topicu
http://forum.php.pl/viewtopic.php?t=3921[/... (DeyV) ------------------------------------------------- scaner: ale to byly inne jezyki (jak i inne czasy). Dzis ludzie ucza sie od razu na jezykach wysokiego poziomu i nie maja pojecia co to jest zmienna, co to jest pamiec, jak to to jest zarzadzane... DayV - jasne, ze mozna i ze robi sie tak. Pytanie tylko czy to maniera prawidlowa i czy tak wlasnie powinno sie nauczac? :wink: Ja ignorowalem noticy dopoki przypadkiem nie przyszlo mi stawiac mojego skryptu na wlasnie takim serwerze jak opisalem... Od tego czasu zawsze pilnuje zeby nie bylo najmniejszego nawet bledu. A swoja droga... no coz, sprawdzilem. Maszyna: Athlon 1.8Ghz, WinXP, Apache2, php 4.3.0: Kod 1) w php.ini error_reporting = E_ALL & ~E_NOTICE [php:1:db2ac36647]<?php $m=0; for ($i=0;$i<10000;$i++ ){ if($x) { $m=1; } } ?>[/php:1:db2ac36647] Wynik ab -n 300 - Requests per second: 40.76 [#/sec] (mean) Kod 2) w php.ini error_reporting = E_ALL [php:1:db2ac36647]<?php $m=0; for ($i=0;$i<10000;$i++ ){ if(isset($x)) { $m=1; } } ?>[/php:1:db2ac36647] Wynik ab -n 300 - Requests per second: 91.87 [#/sec] (mean) No to chyba mam mocny argument? (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Przyjaciele php.pl Postów: 195 Pomógł: 0 Dołączył: 7.07.2003 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Hmm... Nie! (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Nadal sie nie zgadzamy.
Skoro tak sprawiasz problem, zatomizujmy go. Bo wszystko zalezy od tego ktora z dwoch relacji wystepuje w naszym problemie: 1) Potrzebujemy sprawdzic czy zmienna rzutowana na boolean nie jest FALSE, ale (!!) jestesmy pewni, ze zmienna istnieje. 2) Potrzebujemy sprawdzic czy zmienna istnieje czy tez nie. Zgodzisz sie chyba, ze zazwyczaj nastepuje jedna z tych dwoch relacji (bardzo zadko obie na raz) - albo zmienna np. otrzymujemy REQUESTem i wtedy nie jestemy pewni czy przyszla (lub jest deklarowana w bloku warunkowym itp.) albo zmienna jest deklarowana zawsze i chcemy tylko sprawdzic czy jest FALSE. No to przypadek pierwszy: A: [php:1:e2193ca940] <? $m=0; $x=0; for ($i=0;$i<10000;$i++) { $x=rand(0,1); if ((bool)$x) { $m=1; } } ?> [/php:1:e2193ca940] B: [php:1:e2193ca940] <? $m=0; $x=0; for ($i=0;$i<10000;$i++) { $x=rand(0,1); if ($x) { $m=1; } } ?> [/php:1:e2193ca940] a) A - ~34 req/sec c) B - ~34 req/sec Wyniki podane sa dla E_ALL, ale robilem je takze (dla uczciwosci) dla ~E_NOTICE - te same wyniki Co wiecej, w tej sytuacji dla empty($x) tez otrzymuje te same wynki (w granicy bledu stat.) A teraz przypadek drugi. Od razu uprzedzam, ze nie ma odniesienia do wynikow poprzednich, bowiem, jak slusznie zauwazyles, tamten test bazowal na zalozeniu ze sprawdzamy zmienna ktora nie istnieje i dobral (mam nadzieje, dosc jasno) optymalna metoda do tego. Jednak zadko sprawdzamy istnienie zmiennej nie majac choc cienia szansy ze takowa sie pojawi. Zatem nowy test: A) [php:1:e2193ca940] <? $m=0; for ($i=0;$i<10000;$i++) { unset($x); $r = rand(0,1); if ((bool)$r) { $x=1; } if ($x) { $m=1; } } ?> [/php:1:e2193ca940] (IMG:http://forum.php.pl/style_emoticons/default/cool.gif) [php:1:e2193ca940] <? $m=0; for ($i=0;$i<10000;$i++) { unset($x); $r = rand(0,1); if ((bool)$r) { $x=1; } if (isset($x)) { $m=1; } } ?> [/php:1:e2193ca940] a) test A + ~E_NOTICE (dla wlaczonego notice nie robilem bo po pierwsze juz wiemy jak to wyglada, po drugie nikt na stronie nie chce pokazywac chyba bledow? (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) ) - ~20 req/sec (IMG:http://forum.php.pl/style_emoticons/default/cool.gif) test B + E_ALL (dla E_NOTICE tez nie ma sensu robic, bo jak juz udowodnilismy, jesli unikamy noticow, to ich wyswietlanie lub nie nie wplywa na wydajnosc) - ~29 req/sec Coz mamy? Po pierwsze sprowadzilismy problem do podloza - czyli licytacji czy lepiej wylaczyc notice i uzywacv skladni A czy wlaczyc i skladni B, po drugie... no coz... jednak moje? Teraz dochodzimy do ostatniego punktu. A co jesli...? A co jesli jednak w jakijs sytuacji (w jakims warunku) sprawdzasz i jedno i drugie? Przykladem takiej sytuacji niechaj bedzie - zmienna moze przyjsc z requesta i moze byc pusta (puste pole) - wowczas FALSE, inaczej TRUE. I znowu, dzieki dwom wnioskom opisanym powyzej pozostaja nam dwa testy do sprawdzenia (zamiast wszystkich kombinacji) A) [php:1:e2193ca940] <? $m=0; for ($i=0;$i<10000;$i++) { unset($x); $r = rand(0,1); if ((bool)$r) { $l = rand(0 , 1); if ((bool)$l) { $x=''; } else { $x='aaa'; } } if (!empty($x)) { $m=1; } } ?> [/php:1:e2193ca940] (IMG:http://forum.php.pl/style_emoticons/default/cool.gif) [php:1:e2193ca940] <? $m=0; for ($i=0;$i<10000;$i++) { unset($x); $r = rand(0,1); if ((bool)$r) { $l = rand(0 , 1); if ((bool)$l) { $x=''; } else { $x='aaa'; } } if ($x) { $m=1; } } ?> [/php:1:e2193ca940] a) A + E_ALL - ~ 20 req/sec (IMG:http://forum.php.pl/style_emoticons/default/cool.gif) B + ~E_NOTICE - ~ 15 req/sec Wniosek? Nawet w przypadku gdy zajmujemy sie najszerszym mozliwym aspektem zastosowania konstrukcji if($x) nadal empty wygrywa. I to przy zalozeniu, ze w 50% sytuacji zmiennej x nie ma, w 25 jest i jest pozytywna, a jeszcze w 25% jest TRUE. A przeciez jesli zdarza sie przyklad ktory opisalem, to zdecydowanie wiecej jest odslon z pokazaniem formularza (zmiennej nie ma) niz z wyslaniem. Ufff.... dobrze zrozumialem Twoje zalozenia? (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Ogolnie wychodzi mi, ze lepiej jest zawezac wybor (co logiczne i czemu konstrukcja if($x) szkodzi ;p) a jesli sie nie da, stosowac jawne sprawdzanie. Do tego dodam, powinno Ci sie spodobac, ze empty sprawdza tez czy tablica nie jest pusta... czyli ma wiecej zastosowan . |
|
|
![]() ![]() |
![]() |
Aktualny czas: 5.10.2025 - 10:01 |