Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Najczęstsze błędy w PHP i antywzorce
Forum PHP.pl > Inne > Hydepark
Stron: 1, 2
CuteOne
@Lysiur pomysł dobry ale..
- nie było by żadnej konstruktywnej dyskusji tylko spam o dupie maryli (zobacz tematy w PHP/Pro). W najlepszym wypadku był by to spam, wnoszący rąbek wiedzy w dany temat..
- druga sprawa to hateowanie zaproponowanych rozwiązań.. i nie mówię tu o konstruktywnej krytyce, którą zawsze jest miło usłyszeć a o zwykłym wyśmiewaniu się tych "pseudo proprogramistow"

Lysiur
@CuteOne: Niestety muszę się z Tobą zgodzić. Prawda jest taka, że w natłoku śmieciowej wiedzy i puszenia się, rośnie ilość tandetnych wpisów na które poprostu szkoda czasu smile.gif Idea byłaby fajna, gdyby dało się nad tym rozsądnie zapanować smile.gif A tak to przegląda się dziesiątki informacji z których nic nie wynika.

Swoją drogą przypomina się wpis na blogu, jakiegoś speca od JS smile.gif Twierdził on bowiem, że

  1. ....
  2. var aArray = new Array();
  3.  
  4. //Jest wolniejsze i zabiera więcej pamięci niż konstrukcja:
  5.  
  6. var aArray = [];
  7. ....


Co najlepsze tkwił w przekonaniu, wręcz zarzekał się, że druga opcja nie wywołuje konstruktora :-) Padłem plackiem ;-)
sowiq
Cytat(Lysiur @ 16.01.2013, 15:40:24 ) *
Twierdził on bowiem, że
[JAVASCRIPT] pobierz, plaintext
  1. var aArray = new Array();
  2. //Jest wolniejsze i zabiera więcej pamięci niż konstrukcja:
  3. var aArray = [];
[JAVASCRIPT] pobierz, plaintext


No i miał rację (oczywiście oprócz konstruktora). Książka "Wysoko Wydajny JavaScript" autorstwa Nicholasa C. Zakasa (O'Reilly) powiada tak:
Cytat
Chociaż z technicznego punktu widzenia nie ma nic złego w tym podejściu [mowa o 'new Array()' i 'new Object()' - przyp. sowiq], literały są interpretowane szybciej. Dodatkowym bonusem jest fakt, że literały zajmują mniej miejsca w kodzie, więc rozmiar całego pliku jest mniejszy [czyli zajmuje mniej pamięci - przyp. sowiq]
[...]
W miarę jak rośnie liczba właściwości obiektów i elementów tabel, rośnie również korzyść z użycia literałów.


To tak odnośnie puszenia się wink.gif
amii
Jeśli już jesteśmy przy JS to warto wspomnieć o domknięciach a zwłaszcza domknięciach tworzonych w pętli pamiętam jak swego czasu miałem WTF odnośnie takiej konkstrukcji. Tu się można dokładnie zaznajomić z kwestią domknięć : https://developer.mozilla.org/en-US/docs/Ja.../Guide/Closures

A jeśli chodzi o php to kiedyś przez ten błąd(?) nie przyjęli mnie do roboty, mianowicie chodziło o ciapki w php, które są szybciej przetwarzane (firma miała hopla na punkcie szybkości i wydajności bo pisali aplikacje pod urządzenia mobilne a było to z 3 lata temu).
Teraz pamiętam, że jeśli nie ma zmiennych w środku to robimy tak:
  1. 'ala ma kota';
a ze zmiennymi lepiej tak:
  1. "ala ma $zmienna";


To chyba było ale jeśli coś wypluwamy na widok to lepiej dopisywać do zmiennej a nie walić echami i printami
sazian
Cytat(amii @ 16.01.2013, 19:13:13 ) *
Teraz pamiętam, że jeśli nie ma zmiennych w środku to robimy tak:
  1. 'ala ma kota';

a ze zmiennymi lepiej tak:
  1. "ala ma $zmienna";

a ja bym powiedział zawsze robimy tak
  1. 'ala ma kota';
  2. 'ala ma '.$zmienna;

dlatego że tak jest czytelniej
pyro
Cytat(sazian @ 16.01.2013, 19:41:47 ) *
a ja bym powiedział zawsze robimy tak
  1. 'ala ma kota';
  2. 'ala ma '.$zmienna;

dlatego że tak jest czytelniej


I jak chce się przefiltrować zmienną jakąś funkcją, to nie trzeba nic już robić z cudzysłowami. Mniejsze narażanie się na parse errory tongue.gif
!*!
Poprawne ścieżki chyba jeszcze nie zostały wymienione.

  1. $path = 'C:\\tajny katalog\cololwiek';

Już pomijam podanie nazwy dysku, bo powodów może być dużo... chodzi tu o separator katalogów, windows to jedyny system na świecie gdzie dopuszczalne są dwie wersje \ oraz /

Jednak, aby nasz skrypt działał na wszystkim, nawet na tosterze trzeba używać /

  1. $path = '/tajny katalog/cololwiek';


W ostateczności, jeśli się czegoś boimy, mamy fobie lub nałogowo skubiemy słonecznik:

  1. $path = DIRECTORY_SEPARATOR.'tajny katalog'.DIRECTORY_SEPARATOR.'cololwiek';

DIRECTORY_SEPARATOR ma jedną wadę, nie na wszystkich serwerach istnieje więc trzeba pierw to sprawdzić, jednak zalecałbym po prostu dostosowanie się i używanie / które obsłuży każdy system.
ano
Cytat(amii @ 16.01.2013, 19:13:13 ) *
A jeśli chodzi o php to kiedyś przez ten błąd(?) nie przyjęli mnie do roboty, mianowicie chodziło o ciapki w php, które są szybciej przetwarzane (firma miała hopla na punkcie szybkości i wydajności bo pisali aplikacje pod urządzenia mobilne a było to z 3 lata temu).
Teraz pamiętam, że jeśli nie ma zmiennych w środku to robimy tak:
  1. 'ala ma kota';
a ze zmiennymi lepiej tak:
  1. "ala ma $zmienna";


To chyba było ale jeśli coś wypluwamy na widok to lepiej dopisywać do zmiennej a nie walić echami i printami


To się ciesz, że Cię tam nie przyjeli - nie ma różnicy w wydajności w runtime pomiędzy " a '. Jeżeli oni ją odczuwają to trzeba im było doradzić, żeby zaczęli korzystać z APC ;-)

Bardzo dokładnie i dobrze wytłumuaczył to jeden z contributorów php:
https://github.com/fabpot/Twig/issues/407#i...comment-1725017
Masz tam nawet linki do konkretnych linijek kodu c++ za to odpowiedzialnego ;-)
!*!
@up czyli jak mam odebrać te wyniki, bo nie za bardzo rozumiem.

  1. print timeFunc('Method1', 1000) . "\n<br>"; //0.000177661
  2. print timeFunc('Method2', 1000) . "\n<br>"; //0.000128326
skowron-line
- Kod bez komentarzy to zuo, o tym trzeba pisać to trzeba piętnować.
- Zapytanie w pętli
- Pętla w pętli pętlą popętla
ano
Cytat(!*! @ 18.01.2013, 11:35:50 ) *
@up czyli jak mam odebrać te wyniki, bo nie za bardzo rozumiem.

  1. print timeFunc('Method1', 1000) . "\n<br>"; //0.000177661
  2. print timeFunc('Method2', 1000) . "\n<br>"; //0.000128326


? Jak odebrać te wyniki? Nie mam pojęcia bo nie wiem co to za wyniki, co ma robić ten kod, jak wygląda timeFunc? Itd. Poza tym te dwie linijki są takie same ;-)

I przeczytaj dokładnie wpis z githuba a wszystko stanie się jasne.
!*!
@up to są wyniki funkcji z linku jaki podałeś.
redeemer
!*!: Ten "test" jest nierzetelny, nie powinno tam być microtime(true)?
ano
@redeemer - o, kolejna rzecz którą można dopisać do listy z tego tematu ;]
Oczywiście, że powinno być (true)

@!*!
A jesteś świadomy, że 0.000177661 seconds = 0.177661 milliseconds
=> wartość nieistotna, równie dobrze może to być błąd pomiarowy, wyższe obciążenie CPU na te 0.12 milisekundy... itd itp.

Poza tym przeczytaj wszystko co ja napisałem i co piszą "tam":
Jakby koleś odpalił drugi raz ten skrypt (na php z włączonym APC) to wynik dla " i ' byłby IDENTYCZNY.
!*!
redeemer - może i powinno to nie jest istotne, obojętnie jakbyśmy tego nie mierzyli, wynik będzie z korzyścią dla przykładu drugiego, gdzie używasz apostrofów a zmienne są poza nimi.

@ano - tak, przeczytałem i uważam że On się myli. Nie znam się na C, jednak pokaż mi przykład kodu, porównanie gdzie wyniki będą identyczne, dla obu przykładów (kolejność obojętna).
Jedyne z czym się zgodzę to że tzw. tokenizacja przebiega w sposób identyczny dla obu wariantów. Jednak jak pokazują przykłady wyżej samo "tłumaczenie" ich już nie.

I tak, widzę różnice miedzy wink.gif
Cytat
0.00018066... "ble$foo"
0.00012027... 'ble'.$foo


Przy "kliku" pętlach nie ma to znaczenia, ale przy czymś bardziej rozbudowanym? Tak, jest APC czy inne wspomagacze, ale to nie o to chodzi, bo tym sposobem możemy wrócić do pisania stron w C, przecież będą wydajniejsze.

I jak już ktoś tu wspomniał, trudno będzie z "ble$foo" wybrać $foo używając np. token_ get_ all wink.gif Chyba że się nie zrozumieliśmy i każdy z Nas mówi o czymś innym.
ano
Cytat
Tak, jest APC czy inne wspomagacze, ale to nie o to chodzi, bo tym sposobem możemy wrócić do pisania stron w C, przecież będą wydajniejsze.

Sorry, ale o czym Ty mówisz? Co to za porównanie APC do pisania stron w C? Używanie APC powinno być NATURALNE i normalne, a nie jakieś "WOW!".
To tak jakbyś pisał stronę w C++, która przy każdym requeście musi się na nowo kompilować...

Kilka wywołań pętli. Dokładniej tam jest 1 000 000 000 wywołań pętli. I dalej jest to na granicy błędu statystycznego.
Po to dałem ten link, żebyś miał również szansę zobaczyć na kodzik C++, który realizuje tokenizację " i ' i samemu się przekonać, że jego złożoność jest praktycznie identyczna...
!*!
To nie było porównanie. Granice błędu statystycznego? Ok, niech będzie. Tylko nie pisz że oba warianty są tożsame.
ano
Żeby nie było, małe podsumowanie:
Oczywiście najlepszą praktyką jest stosowanie '.
Jednak warto mieć świadomość z czego to wynika i dlatego wiedzieć, że stwierdzenie, że skrypt zawsze będzie szybszy w porównaniu z użyciem " jest błędne.
Natomiast w niektórych sytuacjach użycie " jest uzasadnione i nikt za to nikogo nie powinien wylewać z pracy wink.gif))

@!*! - ok, prostuje: oba warianty są tożsame już po pierwszym odpaleniu skryptu, gdy używa się APC bądź innego narzędzia cache'ującego skompilowany bytecode :-)
!*!
Cytat(ano @ 18.01.2013, 21:13:32 ) *
Jednak warto mieć świadomość z czego to wynika i dlatego wiedzieć, że stwierdzenie, że skrypt zawsze będzie szybszy w porównaniu z użyciem " jest błędne.
Natomiast w niektórych sytuacjach użycie " jest uzasadnione i nikt za to nikogo nie powinien wylewać z pracy wink.gif))


Moim zdaniem jest błędne, ponieważ po co nakładać na parser dodatkową robotę? Wyciąganie " i ' w formie tokenu przebiegnie tak samo, ale już " trzeba przemielić pod kątem, czy przypadkiem coś jeszcze się w nim nie znajduje, a po co skoro są lepsze zapisy? Pisząc zmienne w cudzysłowach skazujemy siebie i innych na porażkę przy debugowaniu, lub chociażby przy prostym zliczeniu zmiennych i wyświetleniu ich nazw.

Mając kod

  1. 'text'.$foo; // będzie wiadomo że jest string i zmienna
  2. "text $foo"; // tu będzie tylko string


Pisząc jakiś prosty debuger, lub dokumentator, musiałbym robić dokładnie to samo z cudzysłowem co parser... Przemielić je jeszcze raz w poszukiwaniu zmiennych.
Więc jaki jest tego sens, skoro wariant pierwszy jest prostszy, szybszy i czytelniejszy?

ps. podane wyniki zostały zredukowane przeze mnie do obrotu 1000 x 1000, zwiększając te wartości przepaść, którą nazywasz błędem statystycznym jest o wiele bardziej widoczna, ale to już każdy może sobie sprawdzić sam.
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.