Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> czy należy korzystać z notice i funkcji typu empty
e-Gandalf
post
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)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
e-Gandalf
post
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 .
Go to the top of the page
+Quote Post

Posty w temacie
- e-Gandalf   czy należy korzystać z notice i funkcji typu empty   8.07.2003, 21:34:10
- - FiDO   CytatSwoją drogą, za starych dobrych czasów, gdy u...   8.07.2003, 22:15:11
- - e-Gandalf   Co tu sie oszukiwac, przeciez na kazdym kroku, zwl...   8.07.2003, 22:22:08
- - DeyV   Bardzo ciekawy test. Szczerze mówiąc wydawało mi s...   8.07.2003, 22:52:38
- - FiDO   Cytat[...] Wynik ab -n 300 - Requests per second: ...   10.07.2003, 00:01:03
- - DeyV   co prawda ja pracuję z wyłączonymi notice, ale, ta...   10.07.2003, 00:13:08
- - e-Gandalf   CytatSprawdzilem to troche doglebniej i sie okazuj...   10.07.2003, 14:05:17
- - kurtz   Cytat...musze przyznac ze bardzo ladna wypowiedz. ...   10.07.2003, 14:20:56
- - FiDO   CytatDla ilu wynikow sprawdziles? Bo u mnie powodu...   11.07.2003, 21:33:42
- - e-Gandalf   Hmm... Nie! Nadal sie nie zgadzamy. Skoro tak sp...   12.07.2003, 01:11:06
- - FiDO   CytatHmm... Nie! Nadal sie nie zgadzamy. CytatWn...   12.07.2003, 01:56:13
- - e-Gandalf   CytatAle to byla walka isset'a z if($x) a tutaj do...   12.07.2003, 07:15:07
- - menic   To może małe podsumowanie bo dyskusja ciekawa Cho...   12.07.2003, 14:49:20
- - FiDO   CytatCytat A jak juz pisalem i mierzylem przy zalo...   12.07.2003, 15:58:34
- - cagrET   to ze E_ALL ^ E_NOTICE jest wolniejsze jest logicz...   14.07.2003, 16:59:35
- - e-Gandalf   Tak, jest to logiczne Tylko, ze logika nie zawsze...   14.07.2003, 23:24:41
- - robokator   He   27.07.2003, 14:30:25
- - FiDO   Re: He   27.07.2003, 20:32:59
- - DeyV   NIe jest to może post na poziomei PRO, ale... wart...   3.08.2003, 18:22:41
- - FiDO   Hmm, a mi sie zawsze wydawalo, ze jak jest registe...   3.08.2003, 20:13:59
- - DeyV   http://forum.php.pl/viewtopic.php?t=1465&h...ghlig...   4.08.2003, 08:05:15
- - FiDO   hmm, faktycznie... chociaz mi sie raczej nie zdarz...   4.08.2003, 08:27:44


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: 5.10.2025 - 10:01