![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 1 332 Pomógł: 294 Dołączył: 12.10.2008 Skąd: Olkusz Ostrzeżenie: (0%) ![]() ![]() |
tak trochu się zastanawiałem i nie wiem czy są jakieś różnice w wydajności, bądź ważniejsze w sposobie rozwiązywania problemów niuanse... np. w necie większość konstrukcji obiektów wygląda w ten sposób:
no i właśnie a pro po publicznych metod i publicznych zmiennych odnośnie tego this.cokolwiek - akurat mi się nie wygodnie pisze, jakoś wolę taką konstrukcję bez this.cokolwiek i bez pisania new podczas tworzenia nowego obiektu:
i tu moje pytanie - jak jest poprawniej, czy są jakieś znaczące tutaj różnice??... może tak przy okazji jakieś linki do trudniejszych artykułów a ciekawszych z niuansami z góry dziękuje ... sorki za podbicie ale znalazłem jeden motyw w tym co ja używam a ktoś mógłby uznać to za wadę - brak zdefiniowanego instanceof - więc odrazu rozwiązanie na instance of without new (IMG:style_emoticons/default/winksmiley.jpg) - tu już może spowolnienie lekkie - na pętlę nie chce mi się sprawdzać - choć raczej nie powinno być gdyż jest zwrócona tylko referencja... a jak jest sporo metod publicznych to jednak wolę pisać jak w poście wyżej drugi przykład zamiast dla każdej metody poprzedzać this... instance of without new (przykład na zdefiniowanie instancji): Kod java script:g=function(){};function c(){var ll=22; return {k:function(){return ll;}}};function a(ob,cialo){ob.prototype=cialo;return new ob;};h=a(g,c());alert(h instanceof g);void(0) ps. aby instancja zosttała zwrócona to funkcja do której przyrównujemy czy istnieje instancja musi być w zasięgu w miejscu gdzie ją sprawdzamy... dalej szukam jakichś za i przeciw który sposób lepszy - lub niech ktoś napisze, że to jeden h* (IMG:style_emoticons/default/winksmiley.jpg) lub jeśli ktoś chce pisać new a nie chce co chwila pisać this wewnątrz gdyż woli notację json: Kod java script:g=function(){};function c(){var ll=22; return {k:function(){return ll;}}};g.prototype=c();h=new g;alert(h instanceof g);void(0)
Ten post edytował zegarek84 6.01.2010, 16:40:15 |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 53 Pomógł: 1 Dołączył: 28.09.2007 Skąd: Gdynia Ostrzeżenie: (0%) ![]() ![]() |
Specjalnie dla Ciebie, wielki test:
Oto wyniki: Firefox 3.6 beta 5: 5054, 6622, 5887, 2726 ms Opera 10.10: 2102, 2079, 2925, 1381 ms Chrome 4.0.249.43: 310, 302, 369, 75 ms IE 8: 8085, 8315, 10457, 6007 ms Są to średnie z 3 testów dla wszystkich przeglądarek z wyjątkiem IE, nie chciało mi się tyle czekać. Zdecydowanym faworytem jest klasa utworzona z prototypu, czyli nasze D. Rozwiązanie z funkcją zwracającą obiekt © nie sprawdza się za dobrze w większości przeglądarek. Rozwiązania z funkcją i nieszczęsnym this-em (A i (IMG:style_emoticons/default/cool.gif) uzyskują podobny średni wynik, z przewagami zależnymi od przeglądarki. Pewnie za wcześnie na poważne wnioski, ale ten banalny test wykazuje pewną wyższość konstrukcji z prototypem. Test sprawdza specyficzną rzecz - mianowicie szybkość tworzenia, inicjowania i użycia egzemplarza klasy. Innym razem trzeba sprawdzić jak będą kształtowały się profile wydajności w przypadku iteracji samego użycia egzemplarza, bez jego tworzenia. Sytuacja tworzenia egzemplarza w każdej iteracji jest raczej nietypowa - przez co niezbyt miarodajna. Żeby zakończyć ten odcinek jakimś morałem - wydaje mi się, że ogólny wniosek płynący z tego doświadczenia - 1 ch. (IMG:style_emoticons/default/smile.gif) Są pewne różnice w wydajności, ale generalnie jeśli nie liczymy taktów procka jak w demie na C64 - style klas zostaną chyba w całości w kwestii upodobań danego programisty. PS, mały update, sprawdziłem jeszcze
Uzyskuje nieznacznie gorsze wyniki od D we wszystkich przeglądarkach z wyjątkiem FF, gdzie wychodzi odrobinę szybciej, ale może to być mimo wszystko błąd pomiaru. Myślę sobie, że silniki JS chyba optymizują jakoś definicje via prototype. Ja więc zostaję przy nich, z ulubionym stylem Class.prototype = JSON. (IMG:style_emoticons/default/smile.gif) |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 1 332 Pomógł: 294 Dołączył: 12.10.2008 Skąd: Olkusz Ostrzeżenie: (0%) ![]() ![]() |
może będzie ciekawa dyskusja (IMG:style_emoticons/default/winksmiley.jpg) ... i a pro po mi chodziło o troszku inny sposób tworzenia obiektów, coś ala jak obiekt C ale bez parametru new (i tu czas jest TNC zbliżony a nawet ciutkę szybszy od ta) , poza tym zawsze powinno się używać var gdyż inaczej zmienne lądują do globalnego window lub czasem powodują błędy jeśli w tym window nie były zdefiniowane - no chyba, że się chce przypisać wartość w window - ale wcześniej tam powinny być zdefiniowane...
pobawiłem się tym skryptem by wyciągnąć dodatkowe wnioski... no nie trzeba było definiować w prototype pustej zmiennej y skoro jest w funkcji - czas też minimalnie szybszy... jedna zasadnicza uwaga to w niektórych obiektach często się przydają (choć nie zawsze) zmienne prywatne (definiowane wewnątrz funkcji przez var), więc aby mieć dostęp do niektórych rzeczy zależnych od zmiennych prywatnych lub by móc je "ustawiać" to kilka metod prywatnych należało by zdefiniować w funkcji (i tu najszybciej wypada akurat definicja this.metoda/zmienna)... wniosek - wszystkie publiczne metody korzystające z publicznych zmiennych/metod i tak jest najszybciej zdefiniować przez rozszerzenie konstruktorem prototype (jednak rozszerzając przez prototype nie mamy dostępu do zmiennych/funkcji prywatnych - chyba, że przez metody publiczne) ps. w językach skryptowych szybszy jest zapis ++i od zapisu i++ ogólnie może jeszcze ktoś ciekawie podsumuje... i masz niezły komputer ;p (testy zrobiłem z tym na operze 10.10 na suśle i czasy wyszły mniejsze ;p):
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 22.08.2025 - 21:13 |