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



Teraz jest 4 gru 2024, o 10:13


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 ]
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 ]
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:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO