Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 7 kwi 2025, o 01:18


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 3 ] 
    Autor Wiadomość
    PostNapisane: 26 sty 2016, o 17:48 
    Offline
    Użytkownik

    Dołączył(a): 08 maja 2014
    Posty: 61
    Pomógł: 1

    Witam

    Podczas tworzenia pewnego kodu zaczęła mnie irytować jego obszerność w związku z czym postanowiłem go troszkę uprościć.
    Napotkałem się przy tym jak dla mnie, na ciekawą zagwozdkę. Mam kila różnych klas, z których każda ma metodę
    o nazwie Move ( PoinF p ); i wiele innych metod o tej samej nazwie.
    Na początku, kod do przemieszczania obiektów wyglądał tak:

    UWAGA! "ify" są pod komentarzem ponieważ wcześniej ich nie było.

    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język csharp
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Duży, tłusty i rozlazły, jak się wydawało niepotrzebnego kodu. Pomyślałem sobie, że skoro każda z tych klas ma nazwe Move ( PoinF p ); to pyknę ją i resztę wspólnych metod do interfejsu. Całość o identycznym działaniu zawarłem w takim kodzie:

    Składnia: [ Pobierz ] [ Ukryj ]
    język csharp
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    I tu niespodzianka. Program zaczął klatkować podczas przemieszczania obiektów. Moje pytanie brzmi, dlaczego?

    Tak wygląda metoda GetAllGridObiects ( ); - Też źle napisana wiem. Zmienię to, mimo wszystko nie jest tak obszerna, żeby w takim stopniu
    zwalniać procek. Jaka jest różnica czasu wykonywania kodu? Za pomocą klasy Stopwatch zmierzyłem, że wykonywanie się długiego, obrzydliwego
    i przerażającego kodu wynosi mniej niż 1 ms. Zaś czas wykonywania krótkiego foreach trwa nawet 10ms!?!?!?! Czy metoda FindAll jest tak prockożerna?

    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język csharp
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Pozdrawiam, Maciek.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 26 sty 2016, o 18:08 
    Offline
    Użytkownik

    Dołączył(a): 20 lip 2015
    Posty: 83
    Pomógł: 6

    Specem od C# nie jestem, ale na pewno nie musisz każdej instrukcji "try-catchować" wystarczy jeden obejmujący całość operacji, jak gdzieś wyskoczy wyjątek to Ci go ładnie złapie. Ten try-catch może chyba w sobie nawet obejmować całe ciało pętli.

    Zapisy w stylu foreach z reguły są wolniejsze niż zwykłe fory czy while.

    Nie wiem jak dokładnie działa foreach w C#, ale próbowałeś może kolekcję wrzucić do zmiennej przed foreach i po niej iterować? Być może problemem jest ciągła potrzeba wykonania "findAll" ?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 26 sty 2016, o 18:36 
    Offline
    Użytkownik

    Dołączył(a): 08 maja 2014
    Posty: 61
    Pomógł: 1

    Już wyjaśniam

    Metoda GetAllGridObjects jest źle napisana, bo pętla while wykonuje się tyle razy ile jest sumarycznie obiektów co jest głupie, ponieważ powinna się wykonać tyle razy
    ile obiektów ma najdłuższy Listing. Czyli jeśli childrenWire zawiera 100 elementów i to jest najwięcej, np childrenSquare ma tylko 20 elementów to pętla się powinna wykonać 100 razy, nie mniej i nie więcej. Aktualnie to działa tak, że jeśli listing childrenWire ma 100 elementów a childrenSquare 20, pętla wykonuje się 120 razy - głupota! Nie ma to jednak super mega wielkiego znaczenia, ponieważ ile można umieścić na stronie. Ta liczba nie przekracza nigdy 60 elementów z wszystkich listingów w sumie!

    Z tym try{} catch{} jest tak, że jak mam wszystko osobno to w przypadku błędu ominie mi tylko jeden listing. Jeśli bym dał wszystkie listingi do jednego try'a to wtedy
    jeżeli w pierwszym z góry listingu wywali wyjątek, to przechodzi do instrukcji catch{} pomijając całą resztę i w rezultacie tracę całą resztę o aktualnie przzeszukiwanym indeksie.

    Zarówno metoda GetAlGridObject() jak i FindAll zwraca List<object>. Nie wiem czy te metody wykonują się z każdy "obrotem" pętli foreach czy też działa to tak,
    że tylko raz wykonuje te metody i w następnym obiegu pętli w tamtym miejscu już jest poprzednio zwrócony listing i tylko leci po indeksach.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    Wyświetl posty nie starsze niż:  Sortuj wg  
    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 3 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


    Nie możesz rozpoczynać nowych wątków
    Nie możesz odpowiadać w wątkach
    Nie możesz edytować swoich postów
    Nie możesz usuwać swoich postów
    Nie możesz dodawać załączników

    Szukaj:
    Skocz do:  
    cron
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO