Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> Kurs JavaScript, Własny kurs języka programowania JavaScript
lukasz1985
post 10.12.2012, 18:01:53
Post #1





Grupa: Zarejestrowani
Postów: 205
Pomógł: 43
Dołączył: 5.03.2012

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


Od dłuższego czasu zajmuję się programowaniem w JavaScript i postanowiłem podzielić się swoją wiedzą i napisać kurs JavaScript.

Kurs możecie znaleźć pod adresem http://kursjs.net76.net/.

Zapraszam do czytania. Dziękuję za wszelkie uwagi. Kurs będzie dopracowywany z upływem czasu.
Go to the top of the page
+Quote Post
Pawel_W
post 10.12.2012, 18:33:09
Post #2





Grupa: Zarejestrowani
Postów: 1 675
Pomógł: 286
Dołączył: 15.06.2009
Skąd: Wieliczka

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


1. Zwiększenie rozmiaru tekstu rozwala menu smile.gif
2. http://kursjs.net76.net/spis-tresci/88-sterowanie/88-petle w listingu masz błąd, alertuje "jest liczbą pierwszą" a powinno być parzystą
3. Nawigacja fadeIn/fadeOut śmiesznie wygląda
4. Ogólnie wg mnie bardzo pobieżnie opisujesz tematy, w tablicach nie dowiedziałem się np. o czymś takim jak array.length a na pewno by mi się to przydało, w pętlach dobrze by było przedstawić zalecane praktyki, jak np. definiowanie warunku na początku, czyli np.
  1. for(var i=0,c=array.length;i<c;i++)
zamiast
  1. for(var i=0;i<array.length;i++)

5. Jak już zacząłem mieszać ocenę treści merytorycznej serwisu z jego wykonaniem to przyczepię się do kodu: za dużo plików .js i .css, powinieneś je poscalać, przyspieszyłoby to ładowanie strony. Dodatkowo skrypty osadzone brzydko wyglądają, powrzucaj je do plików .js
6. Z ilości nagłówków h1,h2,h3,h4... wnioskuję, że starałeś kodować się pod SEO - jeżeli już się za to zabierasz to popracuj jeszcze m.in. nad pustymi tagami, atrybutami title i alt

na razie tyle, nie mam czasu na wnikliwszą analizę smile.gif
Go to the top of the page
+Quote Post
!*!
post 10.12.2012, 18:46:04
Post #3





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

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


1. nawigacja która się snuje podczas przewijania jest zbędna, żeby nie napisać przeszkadza jak cholera...
2. pokuś się o rozbudowanie tematu np. o wyjaśnienie czym różni się poniższy kod:

[JAVASCRIPT] pobierz, plaintext
  1. for(var i = 0 ; i < 20; i++){}
[JAVASCRIPT] pobierz, plaintext

od:
[JAVASCRIPT] pobierz, plaintext
  1. var i = 0;
  2. for(i; i < 20; ++i){}
[JAVASCRIPT] pobierz, plaintext


I dlaczego drugi przykład jest wydajniejszy.

3. tło jest innego koloru niż obraz który się później wczytuje.
4. strona wydaje się "ciężka" podczas przewijania.
5. straszny syf jeśli chodzi o kod, umieść JS i CSS w osobnych plikach (to pewnie wyjaśnia punkt 4).
6. nie pisz w języku polskim kodu, szczególnie gdy piszesz po kilka razy "zmienna" jest to mylące.
7. wyeksponuj bardziej kod, może umieść go w ramce? aby nie zlewał się z tekstem.

Ten post edytował !*! 10.12.2012, 18:57:06


--------------------
Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta).
Go to the top of the page
+Quote Post
pyro
post 11.12.2012, 09:45:18
Post #4





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

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


Cytat
Nazywam się Łukasz, jestem chrześcijaninem.


Ahahahahahhahahahah haha.gif


--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
Go to the top of the page
+Quote Post
mortus
post 11.12.2012, 10:50:55
Post #5





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


@up: W dziale Oceny nie oceniamy czyjegoś wyznania, a przedstawione prace. Twój komentarz jest absolutnie zbędny.

Pomysł dobry, choć w sieci jest cała masa tym podobnych kursów. Layout jak dla mnie zbyt klasyczny i trochę zbyt szarawy.
Go to the top of the page
+Quote Post
pyro
post 11.12.2012, 20:25:15
Post #6





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

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


Cytat(mortus @ 11.12.2012, 10:50:55 ) *
@up: W dziale Oceny nie oceniamy czyjegoś wyznania, a przedstawione prace. Twój komentarz jest absolutnie zbędny.


Tak samo w dziale Oceny nie oceniamy czyjegoś gustu kulinarnego, umiejętności prowadzenia samochodem oraz koloru włosów, a także wielu innych. Brawo @mortus. Cieszę się, że to zauważyłeś!


--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
Go to the top of the page
+Quote Post
kamil4u
post 11.12.2012, 21:11:32
Post #7





Grupa: Zarejestrowani
Postów: 2 350
Pomógł: 512
Dołączył: 4.01.2009
Skąd: Wrocław / Świdnica

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


Moim zdaniem dobra robota. Można się przyczepić do wielu rzeczy, ale moim zdaniem kurs ma być przeznaczony dla początkujących, więc jak za dużo będziesz mącił to wyjdzie coś czego początkujący nie zrozumie. Dlatego moim zdaniem na razie nie powinieneś opisywać wszystkich zawiłości języka. Ew. zrobić drugą część kursu, gdzie opisujesz znacznie trudniejsze rzeczy.

Tak na szybko - brakuje mi dokładniejszego opisu zmian w DOM-ie. Chociażby https://developer.mozilla.org/pl/docs/DOM/e...nt.setAttribute (przynajmniej nie znalazłem na szybko).

Fajnie by też było jakbyś linkował nazwy funkcji do strony mdc - później przyda się umiejętność szukania w dokumentacji.

Cytat
pokuś się o rozbudowanie tematu np. o wyjaśnienie czym różni się poniższy kod:

Po co? Żeby zamotać początkującemu? Przynajmniej takie jest moje zdanie.

Poza tym:
- deklaracja zmiennej "i" nie ma większego znaczenia. Osobiście nie lubię po prostu jak var znajduje się w for-ze, ale to subiektywna ocena. Używam:
Kod
var i;
for( i=0; ...... )

- różnica między ++i , a i++ w for-ze jest bardzo bardzo bardzo znikoma. W swojej "karierze" tylko raz musiałem używać wszystkich dostępnych tricków, żeby aż tak zoptymalizować kod. Jest potrzeba, żeby początkujący to wiedział?

Ten post edytował kamil4u 11.12.2012, 21:12:52


--------------------
Go to the top of the page
+Quote Post
lukaskolista
post 14.12.2012, 10:39:19
Post #8





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

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


Cytat
Poza tym:
- deklaracja zmiennej "i" nie ma większego znaczenia. Osobiście nie lubię po prostu jak var znajduje się w for-ze, ale to subiektywna ocena. Używam:
Jak patrze na takie pierdoly to wspolczuje osobom, ktorzy beda sie tego uczyc.
Miedzy var i; a samym i; jest gigantyczna roznica, var powoduje utworzenie zmiennej lokalnej (np. wewnatrz funkcji) i nie jest ona widziana poza blokiem kodu, w ktorym sie znajduje. Nie stosowanie var powoduje deklaracje zmiennych globalnych, czyli na 99% nadpiszesz sobie tym inna zmienna (tez globalna). Nie jestem mistrzem JS, raczej bazuje tylko ja jQuery, wiec jak cos nie do konca dobrze napisalem to prosze mnie poprawic.
Go to the top of the page
+Quote Post
Tuminure
post 14.12.2012, 12:51:44
Post #9





Grupa: Zarejestrowani
Postów: 178
Pomógł: 49
Dołączył: 16.04.2012
Skąd: Bytom

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


@up
Chodzi o różnicę między:
[JAVASCRIPT] pobierz, plaintext
  1. var i = 0;
  2. for(i;...
[JAVASCRIPT] pobierz, plaintext
a
[JAVASCRIPT] pobierz, plaintext
  1. for(var i = 0;...
[JAVASCRIPT] pobierz, plaintext

Skoro już taka dyskusja na ten temat powstała, to może autor tego by się wypowiedział tongue.gif? Bo sam zastanawiam się, czy napisał na dwa różne sposoby przez przypadek (o ile można to tak ująć) i chodziło tylko o różnicę między ++i, a i++, czy może jest różnica między jedną a drugą deklaracją. Osobiście różnicy nie znalazłem, a chętnie bym się dowiedział, czy może jednak jakaś jest.

Ten post edytował Tuminure 14.12.2012, 12:56:32
Go to the top of the page
+Quote Post
Sephirus
post 14.12.2012, 13:10:04
Post #10





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


Widać, że dość starannie podszedłeś do tematu. Dobry kurs to taki, który nie omawia po kolei wszystkiego jak leci a ten, który zatrzymuje się przy ciekawszych "zjawiskach" starając się je opisać na przykładzie zastosowania i pokazuje plusy/minusy/problemy jakie się wiążą z danym zagadnieniem.

Popieram przedmówców by dopisywać gdzie się da czemu coś jest tak a nie inaczej, czemu coś jest wydajniejsze itp. Samo napisanie "to jest lepsze" nie wpadnie w pamięć ani nie przyczyni się do zrozumienia problemu wink.gif

Pod względem wizualnym - dodałbym odrobinę stonowanych kolorów, choć pod względem czytelności dla średniej czcionki jest ok. Pod względem technicznym rażących błędów nie widzę.

Nazwałeś swój kurs "praktycznym" to spore wyzwanie - musisz zatem wyszukiwać i opisywać także różne techniki związane z JS oto kilka moich propozycji, którym możesz poświęcić więcej uwagi:

- JSON,
- AJAX,
- wbudowane i często używane obiekty (Math, Date itp),
- zdarzenia (events),
- wzorzec leniwych funkcji (sam kiedyś o tym nawet pisałem a temat jest ciekawy)

a także inne ciekawe rzeczy, które przykują Twoją uwagę wink.gif

Podoba się smile.gif


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post
kamil4u
post 14.12.2012, 13:38:40
Post #11





Grupa: Zarejestrowani
Postów: 2 350
Pomógł: 512
Dołączył: 4.01.2009
Skąd: Wrocław / Świdnica

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


To ja uzupełnię nieścisłości w temacie:
- var musi być w każdym przypadku przy deklarowani zmiennej - chyba, że jest augmentem funkcji
- zmienna lokalna i globalna do poczytania - absolutnie nie o to mi chodziło przy poprzednim poście.
- nie ma różnicy w kodzie:
Kod
for(var i = 0; i < 20; i++){}

//i

var i = 0;
for(i; i < 20; i++){}


i o to mi się rozchodziło
- w niektórych językach( nie w js ), gdy w for-ze wpiszemy for(var i=0;) to zmienna i będzie lokalna dla for-a.


- jest różnica między:
Kod
i++;
//,a
++i;


Już nie mówiąc, że to inaczej działa( inna liczba będzie zwrócona ) to ++i jest nieznacznie szybsze od i++. Ale żadnych odczuwalnych zmian nie zauważycie.


--------------------
Go to the top of the page
+Quote Post
!*!
post 14.12.2012, 14:19:04
Post #12





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

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


kamil4u - nie wprowadzaj ludzi w błąd.

jest różnica między:
[JAVASCRIPT] pobierz, plaintext
  1. for(var i = 0; i < 20; i++){}
[JAVASCRIPT] pobierz, plaintext

a:
[JAVASCRIPT] pobierz, plaintext
  1. var i = 0;
  2. for(i; i < 20; i++){}
[JAVASCRIPT] pobierz, plaintext


Taka sama jak między:
[JAVASCRIPT] pobierz, plaintext
  1. for(var i = 0; i< data.count ; i++){}
[JAVASCRIPT] pobierz, plaintext

a:
[JAVASCRIPT] pobierz, plaintext
  1. var count = data.count ;
  2. for( var i = 0 ; i< count ; i++){}
[JAVASCRIPT] pobierz, plaintext


http://jsfiddle.net/jDVb5/

lukaskolista już Ci to nakreślił. var w pętlach deklaruje zmienne za każdym razem jej wywołania, tak samo jak sprawdza za każdym razem jej warunek.
To samo odnosi się do odwrotnej iteracji i/lub połączenia warunków:

[JAVASCRIPT] pobierz, plaintext
  1. var i = 0;
  2. while(i< length){
  3. i++;
  4. }
[JAVASCRIPT] pobierz, plaintext


[JAVASCRIPT] pobierz, plaintext
  1. var i = length;
  2. while(i--){}
[JAVASCRIPT] pobierz, plaintext


To prawda że przy wyświetleniu "hello world' żadnych zmian się nie zauważy. Jednak kod pisany optymalnie, nie jest użyty do banalnych zadań i w wypadku gdy coś trzeba wykonać choćby tysiąc razy, różnicę można już wyłapać gołym okiem.

Cytat(kamil4u @ 11.12.2012, 21:11:32 ) *
Po co? Żeby zamotać początkującemu? Przynajmniej takie jest moje zdanie.


Cytat(kamil4u @ 11.12.2012, 21:11:32 ) *
Jest potrzeba, żeby początkujący to wiedział?


Jest, ponieważ to kurs JS i początkujący ma się go nauczyć, łącznie z alternatywnym, optymalnym pisaniem kodu, ponieważ to mu się przyda w przyszłości.

A jak już pisać poradnik, to szeroko. I nie mówię tu że powyższy kurs ma jakieś braki i dlatego jest zły. Nie od razu Rzym zbudowano wink.gif

Ten post edytował !*! 14.12.2012, 14:20:29


--------------------
Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta).
Go to the top of the page
+Quote Post
emp
post 14.12.2012, 14:56:56
Post #13





Grupa: Zarejestrowani
Postów: 195
Pomógł: 14
Dołączył: 12.01.2006
Skąd: Gotham City

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


Cytat(!*! @ 10.12.2012, 18:46:04 ) *
2. pokuś się o rozbudowanie tematu np. o wyjaśnienie czym różni się poniższy kod:

[JAVASCRIPT] pobierz, plaintext
  1. for(var i = 0 ; i < 20; i++){}
[JAVASCRIPT] pobierz, plaintext

od:
[JAVASCRIPT] pobierz, plaintext
  1. var i = 0;
  2. for(i; i < 20; ++i){}
[JAVASCRIPT] pobierz, plaintext


I dlaczego drugi przykład jest wydajniejszy.


Własnie dlaczego ? Skoro javscript przenosi wzystkie deklaracje zmiennych na poczatek funkcji i zakres jest funkcji nie klamr czy pętli.
To var i nie jest deklarowane w pętli, a na poczatku funkcji nie wazne gdzie je umiescisz w funkcji. Tak bynajmniej piszą w książkach np w tej: http://helion.pl/ksiazki/javascript-wzorce...anov,jascwz.htm
Posiadam tylko podstawową wiedze w zakresie javascripta i byłbym wdzieczny jakby mi ktoś to wyjaśnił bo naprawe wzbudziło to moje zainteresowanie dlaczego drugi przykład jest wydajniejszy.
Czy chodzi o różnice w wydajności między pre i post inkrementacją ?

Ten post edytował emp 14.12.2012, 15:17:55


--------------------
Temat zamykam i przenoszę do Bangladeszu.
To jest wiadomość śmierci jeśli ją czytasz to znaczy że pozostało ci 30 sekund życia, więc lepiej zacznij się modlić.
Go to the top of the page
+Quote Post
kamil4u
post 15.12.2012, 00:03:07
Post #14





Grupa: Zarejestrowani
Postów: 2 350
Pomógł: 512
Dołączył: 4.01.2009
Skąd: Wrocław / Świdnica

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


Coś chyba mówisz nie tak. Twój kod z jsfiddle jest bez sensu i nijak ma się do sytuacji.

Pętla for działa tak:
Kod
var i;
for(i=0; i<10; i++){
//instrukcje
}

==

var i;
i=0;
while(i<10){
//instrukcje
i++;
}


Cytat
var w pętlach deklaruje zmienne za każdym razem jej wywołania, tak samo jak sprawdza za każdym razem jej warunek

Od kiedy? Warunek i owszem sprawdzany jest za każdym razem. Ale pierwsza część wywoływana jest tylko raz przed rozpoczęciem pętli.
Dowód:
Kod
for(var i=0; i<3; i++){
    alert(i);
}


Gdyby było tak jak mówisz, dostalibyśmy 3 zera.

Cytat
Jednak kod pisany optymalnie, nie jest użyty do banalnych zadań i w wypadku gdy coś trzeba wykonać choćby tysiąc razy, różnicę można już wyłapać gołym okiem.
Zapewniam Cię, że przy pętli 1000 obrotów nie zauważysz różnicy między ++i ,a i++. To samo przy warunkach( jeżeli warunek jest prosty typu sprawdzenie długości tablicy ).

I żeby nie było akurat przy warunkach to oczywistą rzeczą jest, że lepiej wynik porównać ze zmienną, a nie cały czas ją wyliczać, mimo wszystko różnicy nie zauważysz( jeżeli masz lepszy sprzęt niż przeciętny smartfon ).

Cytat
kamil4u - nie wprowadzaj ludzi w błąd.

Napisz, które moje zdanie jest nieprawdziwe i napisz dokładnie jak powinno być. To co napisałeś teraz uważam, że jest bardzo niewystarczające albo wręcz nie na temat.

Cytat
Jest, ponieważ to kurs JS i początkujący ma się go nauczyć, łącznie z alternatywnym, optymalnym pisaniem kodu, ponieważ to mu się przyda w przyszłości
Ucząc się jeździć samochodem, chciałbyś, żeby instruktorzy pokazywali też jak się jeździ wyścigowo. Nie! Kurs prawa jazdy ma Cię nauczyć jeździć po mieście. Jeżeli chcesz pojeździć rajdowo to zapisz się na inny kurs. Można wspomnieć o jakieś rzeczy, ale rozpisywanie się na temat "szybkiej zmiany biegów w wyścigu", gdy nie umiesz dobrze wrzucić z "jedynki" na "dwójkę" bez szarpania jest moim zdaniem bez sensu.


--------------------
Go to the top of the page
+Quote Post
!*!
post 15.12.2012, 11:30:58
Post #15





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

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


Cytat(kamil4u)
Od kiedy? Warunek i owszem sprawdzany jest za każdym razem. Ale pierwsza część wywoływana jest tylko raz przed rozpoczęciem pętli.

Od zawsze. Nie widzisz różnicy między jej deklarowaniem, a sprawdzaniem, dlatego uważasz że "dostalibyśmy 3 zera", co jest w ogóle bez sensu, bo to tak, jakbyś miał pretensje że w poniższym kodzie wynik będzie 3, a nie 1...

[JAVASCRIPT] pobierz, plaintext
  1. var foo = 1;
  2. var foo = 2;
  3. var foo = 3;
  4. alert(foo);
[JAVASCRIPT] pobierz, plaintext


Idąc dalej, kluczowe jest tu słowo var.

mając pętlę
[JAVASCRIPT] pobierz, plaintext
  1. for(var i=0; i<3; i++){}
[JAVASCRIPT] pobierz, plaintext

i, będzie sprawdzane w takiej postaci:

Kod
var i < 1 // obrót 1
var i < 2 // obrót 2
var i < 3 // obrót 3


zamiast

Kod
i < 1 // obrót 1
i < 2 // obrót 2
i < 3 // obrót 3


czyli na tej samej zasadzie co:

[JAVASCRIPT] pobierz, plaintext
  1. var foo;
  2. var bar;
  3. var ble;
[JAVASCRIPT] pobierz, plaintext

a:
[JAVASCRIPT] pobierz, plaintext
  1. var foo, bar, ble;
[JAVASCRIPT] pobierz, plaintext


Już widzisz różnicę w deklaracji i sprawdzaniu? Prościej nie da się tego wyjaśnić.

Cytat(kamil4u)
Zapewniam Cię, że przy pętli 1000 obrotów nie zauważysz różnicy między ++i ,a i++. To samo przy warunkach( jeżeli warunek jest prosty typu sprawdzenie długości tablicy ).

Możliwe, ilość obrotów była tylko przykładem. Ważne jest też to co jest w środku pętli, a nie to ile ona obrotów wykonuje. Choć tak jak już wspomniałem, nie chodzi tu o
Cytat
alert('helloWorld');


Cytat(kamil4u)
Ucząc się jeździć samochodem, chciałbyś, żeby instruktorzy pokazywali też jak się jeździ wyścigowo. Nie! Kurs prawa jazdy ma Cię nauczyć jeździć po mieście. Jeżeli chcesz pojeździć rajdowo to zapisz się na inny kurs. Można wspomnieć o jakieś rzeczy, ale rozpisywanie się na temat "szybkiej zmiany biegów w wyścigu", gdy nie umiesz dobrze wrzucić z "jedynki" na "dwójkę" bez szarpania jest moim zdaniem bez sensu.

Proszę, napisz jeszcze więcej takich porównań.
Kurs to kurs, jak się upierasz przy jego okrajaniu, bo nie widzisz potrzeby aby początkujący wiedział że istnieje alternatywa/optymalizacja, to zajrzyj do działu przedszkole, gdzie jest pełno kodu, właśnie z kursu dla początkujących, gdzie autor pewnie sam nim był.

Ten post edytował !*! 15.12.2012, 11:32:44


--------------------
Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta).
Go to the top of the page
+Quote Post
kamil4u
post 15.12.2012, 23:05:56
Post #16





Grupa: Zarejestrowani
Postów: 2 350
Pomógł: 512
Dołączył: 4.01.2009
Skąd: Wrocław / Świdnica

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


Cytat
Już widzisz różnicę w deklaracji i sprawdzaniu? Prościej nie da się tego wyjaśnić.

Wreszcie zrozumiałem o co Ci chodzi smile.gif

Powiem szczerze, że o tym nie wiedziałem. Niestety nie mogę nigdzie znaleźć informacji na ten temat - a dokładniej w żadnej dokumentacji, bo na blogu różni ludzi różnie piszą. Jak możesz przytocz informację na ten temat. Ale mniejsza z tym. Zamiast szukać po dokumentacjach i patrzeć do kodu przeglądarek proponuję zrobić niezależny test i będzie wszystko wiadomo:

Kod
<script>
    function S(F,C,t){for(t=new Date();C--;F());return new Date()-t; } //speed, F->funkcja, C->ilość cykli
    
    function test1(){
        var i;
        for(i=0; i <= 100000; ++i){
        }
    }

    function test2(){
        for( var i=0; i <= 100000; ++i){
        }
    }

    function test3(){
        for( var i=0; i <= 100000; i++){
        }
    }

    var j;
    function test4(){
        for(j=0; j <= 100000; j++){
        }
    }
    
    alert ( S(test1,10000)+' ms <-- 1' );
    alert ( S(test2,10000)+' ms <-- 2' );
    alert ( S(test3,10000)+' ms <-- 3' );
    alert ( S(test4,10000)+' ms <-- 4' );  
</script>


Od razu widać, że zmienna globalna( test4 ) to spory spadek na wydajności. Jednak wszystkie pozostałe 3 rozwiązania są do siebie bardzo zbliżone. Różnica jest około 3 milisekund. W większości przypadków test1( Twój faworyt ) wypada najlepiej, ale nie zawsze.

Teraz szybie obliczenia: 10000*100000 = 1 000 000 000 = 1 miliard!
I różnice są rzędu 3ms. Dodatkowo trzeba zaznaczyć, że średnia wyników( dla test 1) to 1015 ms. Czyli 0,296%.

Teraz pytanie czy warto się przejmować spadkiem wydajności o około 0,296%( i nie zawsze jest powiedziane, że "test1" jest najszybszy - podkreślam, że w większości wypadków tak, ale to nie oznacza, że we wszystkich )? Przy myśleniu nad tym pytaniem warto sobie przypomnieć, że czytając taki kurs czytający jest z reguły początkującym. Jest to pytanie retoryczne. Niech każdy sam sobie odpowie na to pytanie i ew. zmieni, bądź nie decyzję. Każdy z nas swoją opinię na ten temat wyraził, więc nie ma sensu prowadzić tego sporu( chyba, że masz jakąś interesującą uwagę do przekazania ).

Chciałbym zaznaczyć, że nie jestem przeciw optymalizacji kodu nawet jeżeli tyczy się to około 0,296%. Sam z reguły to robię, jednak nie oznacza to, że te różnice są zauważalne i, że początkujący musi o nich myśleć. Myślę, że optymalizacji należy szukać gdzie indzie niż w konstrukcji pętli for, bo moim zdaniem 3ms na miliard obrotów to żadna oszczędność, a na pewno w większym kodzie da się poprawić mnóstwo innych rzeczy.

Cytat
bo nie widzisz potrzeby aby początkujący wiedział że istnieje alternatywa/optymalizacja

Całkowicie nie o to mi chodzi. Moim zdaniem początkujący nie musi wiedzieć wszystkiego na raz. Z biegiem czasu dowie się o nowych metodach, algorytmach i jego kod będzie coraz lepszy. Tylko na początku trzeba zachęcić go do nauki, a podając mnóstwo informacji "na raz" moim zdaniem go zniechęcamy. Jak złapie bakcyla to wtedy należy mu mówić o wszystkim smile.gif

Pozdrawiam.

PS. Z tym źródłem to było na serio. Jak możesz przytocz jakieś rzetelne informacje na ten temat. Zawsze lubię się dowiedzieć czegoś nowego. Jeśli to prawda to dzięki za poprawę.

PS2. Oczywiście wyniku testów czasowych są sprawdzane na moim kompie i u każdego mogą być różne. Wpływa na to wszystko smile.gif Ale proporcje powinny być podobne.


--------------------
Go to the top of the page
+Quote Post
!*!
post 16.12.2012, 11:44:50
Post #17





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

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


Nie podam Ci linku z dokumentacji, ponieważ JS jej nie posiada. Implementacje w przeglądarkach opierają się na standardzie ECMA, który nie zawsze jest przestrzegany, żeby nie napisać, olewany...
Tego typu smaczki, sam wyłapiesz podczas pisania bardziej złożonych skryptów. Motyw z var w pętli zauważyłem podczas pisania własnego FW (krótko po tym jak upadł mintajax, ktoś go jeszcze pamięta?), nie pasował mi czas wykonania i ewentualne zacinki podczas bardziej złożonych animacji na drzewie DOM, kombinowałem z różnymi konfiguracjami, pousuwanie var ze wszystkich pętli przyniosło oczekiwany efekt, wniosek z tego był dla mnie jasny, że var obojętnie gdzie jest, zawsze deklaruje zmienną, a że jest w pętli, deklaruje ją dla każdego obrotu (to nawet logiczne, bo tak też działa warunek i instrukcja krokowa).

W swoim teście zapomniałeś o jednej istotnej rzeczy. Zdeklarowałeś zmienną j, ale nie przypisałeś jej wartości, a to właśnie o to się rozchodzi... popatrz:
http://jsfiddle.net/3hMhm/

Cytat
1217 ms <-- 1
1260 ms <-- 2
1167 ms <-- 3
6 ms <-- 4


Myślę że wynik wyczerpuje temat.

Cytat
PS2. Oczywiście wyniku testów czasowych są sprawdzane na moim kompie i u każdego mogą być różne. Wpływa na to wszystko Ale proporcje powinny być podobne.

Tym się nie przejmuj, wiele ludzi myśli że jak na ich maszynie kod działa wolniej/szybciej to już test autora można włożyć między bajki... a tu przecież o sumę i porównanie chodzi.

A jak już w ogóle potrzebujesz super wydajności, to dzisiaj wkłada się kod w tzw. workera, gdzie cały kod w nim jest uruchamiany jako osobny proces przeglądarki, ale to już temat na inny wątek.

Ten post edytował !*! 16.12.2012, 11:46:29


--------------------
Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta).
Go to the top of the page
+Quote Post
kamil4u
post 16.12.2012, 14:46:47
Post #18





Grupa: Zarejestrowani
Postów: 2 350
Pomógł: 512
Dołączył: 4.01.2009
Skąd: Wrocław / Świdnica

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


Cytat
Myślę że wynik wyczerpuje temat.

Nie zgodzę się! Masz błąd logiczny. Bardzo mnie zdziwiło, że zmienna globalna jest najszybsza. Patrzę w kod, myślę i nie mogę się nadziwić. Aż w końcu zauważyłem, że jak dasz samo var j = 0; to pętla się nie wykonuje w kolejnych cyklach, bo nie zerujesz zmiennej j wraz z jej przebiegiem.

Tak więc nadal test4 jest najwolniejszy. Różnicę pomiędzy innymi rozwiązaniami są zbliżone i u mnie różnią się o około 3ms. Zmieniając test1 na:
Kod
    function test1(){
        var i=0;
        for(i; i <= 100000; ++i){
        }
    }


Nic się nie zmienia.

Zatem czy nadal uważasz, że 3ms sekundy na miliard! obrotów jest warta zachodu?

U Ciebie z tego co widzę najszybszy jest test3, więc to czym najbardziej walczysz.

Cytat
Motyw z var w pętli zauważyłem podczas pisania własnego FW (krótko po tym jak upadł mintajax, ktoś go jeszcze pamięta?), nie pasował mi czas wykonania i ewentualne zacinki podczas bardziej złożonych animacji na drzewie DOM, kombinowałem z różnymi konfiguracjami, pousuwanie var ze wszystkich pętli przyniosło oczekiwany efekt, wniosek z tego był dla mnie jasny, że var obojętnie gdzie jest, zawsze deklaruje zmienną, a że jest w pętli, deklaruje ją dla każdego obrotu (to nawet logiczne, bo tak też działa warunek i instrukcja krokowa).

Pamiętam! Jeszcze wtedy nie wiedziałem co to jest AJAX i mi ludzie pokazali na tej bibliotece smile.gif

Powyższe testy trochę przeczą temu co napisałeś. Bo na pewno nie inicjujesz zmiennych miliard razy, a jak widać różnica to kwestie ms, czyli niezauważalne dla człowieka. Możliwe, że miałeś rację, ale przeglądarki zniwelowały różnicę w deklaracjach zmiennych i dlatego dzisiaj już nie ma to znaczenia. Poza tym przy operacji na DOM trzeba szukać optymalizacji właśnie tam, bo nie od dziś wiadomo, że najdłużej zajmuje przerysowywanie elementów w przeglądarce.

Cytat
Nie podam Ci linku z dokumentacji, ponieważ JS jej nie posiada.

MDC

Cytat
Implementacje w przeglądarkach opierają się na standardzie ECMA, który nie zawsze jest przestrzegany, żeby nie napisać, olewany...

Tyle o JS wiem. Trochę siedzę już w tym języku. Wydawało mi się, że pętla for nie jest niczym niezwykłym, a my tu już rozmawiamy o niej 3 dzień! Ale to dobrze. Warto wymieniać się uwagami. Tylko nadal nie jestem przekonany do Twoich racji. I testy nie dowodzą, że masz rację, chyba że nadal robię coś źle, tylko napisz co.

Cytat
Tym się nie przejmuj, wiele ludzi myśli że jak na ich maszynie kod działa wolniej/szybciej to już test autora można włożyć między bajki... a tu przecież o sumę i porównanie chodzi.
No o to mi właśnie chodziło. Nie znam Cię na tyle, więc wolałem napisać, ze chodzi o zależności a nie konkretne wyniki.

Pozdrawiam i czekam na wyjaśnienia.

PS. Z chęcią zobaczyłbym ten FW smile.gif


--------------------
Go to the top of the page
+Quote Post
Tuminure
post 17.12.2012, 10:47:39
Post #19





Grupa: Zarejestrowani
Postów: 178
Pomógł: 49
Dołączył: 16.04.2012
Skąd: Bytom

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


Cytat
Nie zgodzę się! Masz błąd logiczny. Bardzo mnie zdziwiło, że zmienna globalna jest najszybsza. Patrzę w kod, myślę i nie mogę się nadziwić. Aż w końcu zauważyłem, że jak dasz samo var j = 0; to pętla się nie wykonuje w kolejnych cyklach, bo nie zerujesz zmiennej j wraz z jej przebiegiem.

Sprawdziłeś? Bo moje console.log(j); twierdzi inaczej (a konkretnie, zmienna się zeruje, jeżeli zrobisz var j = 0;).
Go to the top of the page
+Quote Post
kamil4u
post 17.12.2012, 12:44:18
Post #20





Grupa: Zarejestrowani
Postów: 2 350
Pomógł: 512
Dołączył: 4.01.2009
Skąd: Wrocław / Świdnica

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


Nie musiałem spr. to widać. Mówimy o funkcji:
Kod
    var j=0;
    function test4(){
        for(j; j <= 1000; j++){
        }
    }


Przy pierwszym wywołaniu funkcji test4 jest wszystko ok, bo j = 0;, ale przy drugim wywołaniu funkcji j się nie zeruje, więc j = 1001, więc pętla for się nie wykonuje i tak pozostałe 9998 razy. Stąd czas poniżej 1000ms.

Instrukcja j=0; wykonuje się w programie tylko raz, a konkretniej jeszcze przed mierzeniem wszelkich czasów. Jeszcze inaczej:
Kod
j = 0;
--test4
--pętla ( jeżeli j <= 10000)
j=1;
j=2;
j=3;
...
j=9999;
j=10000;
j=10001;
-- koniec pętli

-- test4
--pętla ( jeżeli j <= 10000)
-- nie wykonuje się, bo j=10001;
-- koniec pętli

-- test4
--pętla ( jeżeli j <= 10000)
-- nie wykonuje się, bo j=10001;
-- koniec pętli

-- test4
--pętla ( jeżeli j <= 10000)
-- nie wykonuje się, bo j=10001;
-- koniec pętli

...


Ten post edytował kamil4u 17.12.2012, 12:45:29


--------------------
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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 Wersja Lo-Fi Aktualny czas: 5.06.2024 - 23:10