Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Sprawdzanie wszystkich istniejacych obiektow


Rekomendowane odpowiedzi

Opublikowano

Temat z serii problemy początkującego 'programisty' :D

 

Mamy 2 klasy:

Class A - (gracz) przechowuje zmienne takie jak NazwaGracza, TypBroni z klasy B  itp...

Class B - (broń) przechowuje zmienne takie jak NazwaBroni, TypBroni itp...

 

Jak będzie wyglądał kod który przeszuka wszystkie obiekty klasy B i sprawdza czy dany obiekt ma ten sam typ broni co gracz?

Proszę o możliwie najprostszy sposób.

 

Z góry dziękuje

 

Opublikowano

Czy moglbys pokazac ten kod?

<18:17:02> "MarmarukHD" został zablokowany permanentnie na serwerze przez "Otek" (Teamspeak przeznaczony dla ludzi.)

Opublikowano

Emm, musiałbyś gdzieś przechowywać te obiekty, tak aby móc je bez problemu potem odnaleźć, bez konieczności tworzenia nowej instancji. Najlepiej do tego obiektu broni dodaj sobie jakiś identyfikator, wtedy do mapki wrzucasz obiekt razem z identyfikatorem i jeśli go znasz - szybko go pobierzesz. Jeśli nie to przeszukujesz mapkę pętlą, zwracasz obiekt (jeśli wolisz opcję bez identyfikatora to użyj setu). W ramach postu pozwolę sobie nazwać Twój obiekt po prostu B - tak jak Ty to nazwałeś.

private final Set<B> bSet = new HashSet<>();

Teraz możesz sobie stworzyć metodę, która Ci zwróci ten obiekt po filtracji setu:

public B get(String name) {
    for (B b : this.set) {
        if (b.getWeaponName().equalsIgnoreCase(name)) return b;
    }
    return null;
}

Pamiętaj też, że przy tworzeniu instancji tego obiektu musisz go zawsze do tego setu dodawać!

Potem tylko porównujesz obiekt z klasy gracza do obiektu pobranego za pomocą pętli.

if (a.getWeapon().equals(get("ak-47"))) {
    //do something with that!
}
Opublikowano

@bartzz

 

Jak juz cos mu pokazujesz moglbys faktycznie to najlepiej wykonac :)

 

Streamy juz sa dosc popularne i coraz wiecej osob powinno je zobaczyc :)

<18:17:02> "MarmarukHD" został zablokowany permanentnie na serwerze przez "Otek" (Teamspeak przeznaczony dla ludzi.)

Opublikowano

@bartzz

 

Jak juz cos mu pokazujesz moglbys faktycznie to najlepiej wykonac :)

 

Streamy juz sa dosc popularne i coraz wiecej osob powinno je zobaczyc :)

Ja go nie uczę programować, tylko tłumaczę jak to może zrobić. Jak będzie się chciał nauczyć Javy 8 to niech poszuka tego na necie, napisałem to standardowo aby zrozumiał kod, Twoim streamem bym musiał mu tłumaczyć 10 tys. kolejnych rzeczy. ;)

Opublikowano

@bartzz

 

Jak juz cos mu pokazujesz moglbys faktycznie to najlepiej wykonac :)

 

Streamy juz sa dosc popularne i coraz wiecej osob powinno je zobaczyc :)

i kompletnie zbędne w takim miejscu, większy narzut niż zysk.

wgl lepszym wyjściem byłaby jakaś mapka

1438614356923701010629.png

 

Opublikowano

@GotoFinal

 

Uczac ich starych nawykow zostaniemy tak samo z wersja javy jak z wersja minecrafta, takze dalej ! :)

<18:17:02> "MarmarukHD" został zablokowany permanentnie na serwerze przez "Otek" (Teamspeak przeznaczony dla ludzi.)

Opublikowano

@GotoFinal

 

Uczac ich starych nawykow zostaniemy tak samo z wersja javy jak z wersja minecrafta, takze dalej ! :)

używając wszędzie lambd obniżysz wydajność i czytelność kodu, oby tak dalej.

Tutaj powinna byż użyta mapka i tyle, a nie żadne streamy, a robienie strema tylko po to by wyszukać 1 element w jest bezsensowne, duży narzut na tak prostą operacje, np policzenie ilości elementów to 10, 20% wolniej jeśli użyjesz strema zamiast głupiej pętli... 

Streamy i lambdy są piękne, ale wtedy kiedy ich użycie ma sens, np removeIf() potrafi znacząco zwiekszyć wydajnośc kiedy użyte na np ArrayList, bo wtedy elementy są usuwane jednocześnie, jako całość. Więc tablica w środku ArrayList nie musi być edytowana wielokrotnie, tylko raz dla całej operacji.

 

A inne przykłady kiedy warto użyć streamy, to wtedy kiedy zgodnie z nazwą ma to sens, czyli mamy kolekcję danych, i chemy na nich wykonać wiele różnych operacji, np masz listę graczy na serwerze, i chcesz:

- każdemu dać 100$

- dla VIP dać dodatkowo 900$

- Dla każdego znajomego vipa dać 450$

- Dla każdego znajomego tych znajomych dać kolejne 100$

I wtedy możemy fajnie układać stream, który kolejno wczyta graczy, da kasę, przefiltruje, da kasę, zmapuje i znowu da kasę, itd, wtedy to ma sens, kod napiszemy znacznie szybciej, a różnica w wydajności nie będzie już zauważalna, a może nawet wzrośnie, w zależności od tego co robimy, ale dla prostych akcji które można zastąpić 3 prostymi linijkami nie ma sensu używac streamów, tylko szkodzą.

1438614356923701010629.png

 

Opublikowano

@GotoFinal

Mowisz strasznie typowo "obnizysz wydajnosc", po to plakalismy prawie 2 lata aby w koncu java wprowadzila streamy i lambdy takie jak w scali, przez to scala wlasnie zyskala popularnosc przez swoja prostote, to ze straci na wydajnosci 30% czy tam 20% nic nie znaczy, idziemy w takie podzespoly ze te milisekundy niedlugo nie beda mialy znaczenia, a jesli chcesz sie przejmowac milisekundami, to strzelam ze pracujesz w google ... :)

 

To ze autor chcial uzyc listy to jego wola, ja uprzedzilem ze lepiej uzyc do tego streama niz starego suchego kodu ktory wyglada OKROPNIE.

 

Najwazniejsze w programowaniu ze kod ma byc przejrzysty i tyle, tam gdzie jest kod przejrzysty tam pisze sie o wiele lepiej, pewnie zobaczysz z czasem.

W kazdym wiekszym corpo liczy sie jakosc kodu, nie wydajnosc, naprawde z czasem nikt juz nie bedzie patrzal na wydajnosc czegokolwiek...

nanosekundy/milisekundy mozna sobei w dupe wsadzic.

 

Streamy nie sa duzym narzutem, i pora aby kazdy sobie zdal z tego sprawe.

 

Bo z tego co widze robi sie placz taki jak na pewnym dev forum, gdzie ktos pokazal ze streamy sa 2x mniej wydajne :)

 

@Edit

 

Polecam jeszcze ksiazke przeczytac apropo jakiegos wygladu jakiegos kodu.

<18:17:02> "MarmarukHD" został zablokowany permanentnie na serwerze przez "Otek" (Teamspeak przeznaczony dla ludzi.)

Opublikowano

@GotoFinal

Mowisz strasznie typowo "obnizysz wydajnosc", po to plakalismy prawie 2 lata aby w koncu java wprowadzila streamy i lambdy takie jak w scali, przez to scala wlasnie zyskala popularnosc przez swoja prostote, to ze straci na wydajnosci 30% czy tam 20% nic nie znaczy, idziemy w takie podzespoly ze te milisekundy niedlugo nie beda mialy znaczenia, a jesli chcesz sie przejmowac milisekundami, to strzelam ze pracujesz w google ... :)

 

To ze autor chcial uzyc listy to jego wola, ja uprzedzilem ze lepiej uzyc do tego streama niz starego suchego kodu ktory wyglada OKROPNIE.

 

Najwazniejsze w programowaniu ze kod ma byc przejrzysty i tyle, tam gdzie jest kod przejrzysty tam pisze sie o wiele lepiej, pewnie zobaczysz z czasem.

W kazdym wiekszym corpo liczy sie jakosc kodu, nie wydajnosc, naprawde z czasem nikt juz nie bedzie patrzal na wydajnosc czegokolwiek...

nanosekundy/milisekundy mozna sobei w dupe wsadzic.

 

Streamy nie sa duzym narzutem, i pora aby kazdy sobie zdal z tego sprawe.

 

Bo z tego co widze robi sie placz taki jak na pewnym dev forum, gdzie ktos pokazal ze streamy sa 2x mniej wydajne :)

 

@Edit

 

Polecam jeszcze ksiazke przeczytac apropo jakiegos wygladu jakiegos kodu.

taki lipny mały steam nie dodaje żadnej przejrzystości... jak nawalisz wszędzie streamów to będzie nawet gorzej, czytać to się tego nie będzie dało.

nanosekundy/milisekundy mozna sobei w dupe wsadzic

przypominam że temat jest o minecrafcie, jak chce tego użyć w np MoveEvent musi zmieść cały kod w około 1ms by nie było programów z wydajnością przy kilkunastu graczach, jak liczy na większe ilości graczy niż 50, to musi to zmieśić nawet w mniejszym czasie, nie ma tutaj miejsca by poświęcić 20% na to by... nic nie sykać do ku... nędzy, ani to nie jest czytelniejsze, ani lepsze, ot zbędne użycie streama.

1ms dla pluginu to... masa, to dokładnie 2% całego dostępnego czasu, a jakieś 80% tego czasu zajmuje sam minecraft ;)

 

To nie webdev gdzie każdy ma wydajność kompletnie w dupie bo im różnicy nie robi czy strona się pojawi w 1 sec czy 2 sec, a wszelki gamedev itd, tutaj dalej liczy się wydajność, a nie tylko zbędne narzuty PSUJĄCE czytelność...

Wszystko ma swoje zastosowania, i tutaj stream nie jest jednym z nich..

 

wygląd/czytelność kodu != najebanie streamami gdzie się da.

 

Wracaj do webdevu i nie denerwuj ludzi... czytelność jest ważna, ale jeszcze raz - tak jej nie zwiększysz, a i jest jakiś limit kosztów... ludzie zaraz zaczną pliki edytowac w List<Byte> zamiast byte[] by wygodniej streamów używać no i obiekty wygodniejsze!

 

A kierunek w jakim zmierza cały dev i tak mi sie nie podoba, sprzęt coraz mocniejszy, programy coraz wolniejsze, rozwój sprzętu nie nadąża nad rozwojem frameworków i języków, a na webdev to szkoda słów, strony potrafiące zjadać więcej niż gry w 3d, i działające od nich wolniej, ech...

1438614356923701010629.png

 

Opublikowano

@GotoFinal

 

Zacznijmy od tego ze stream naprawde rzuca sie ladnie w oczy i da sie szybko polapac o co chodzi, przy 3-4 ifach w petli juz tak ladnie to nie wyglada.

 

Nigdy nie ruszlaem webdevu i nie zamierzalem.

 

Jesli Cie irytuje przez to ze mowie prawde, twoj problem.

Wprowadzasz ludzi w blad wiec z tym sie bede klocil.

 

Skoro tak bardzo Ci zalezy na wydajnosci i kazda milisekunda dla Ciebie jest wazna polecam sie przerzucic na jakis jezyk natywny bo licza sieA 49O8I321BW8954BRUIWAZABE98B5R943219BOI45 MILIIISEKUNDYDYYDYDYDYDY

 

Polecam rowniez odpsucic sobie glowny replace bo jest nie wydajny przeciez! MILISEKUNDY

Rowniez rzuc obiekty bo sa przeciez nie wydajne !

No idiotyzm 21 wieku, to juz nawet nie jest smieszne to co mowisz, wrecz zalosne.

 

"A kierunek w jakim zmierza cały dev i tak mi sie nie podoba, sprzęt coraz mocniejszy, programy coraz wolniejsze, rozwój sprzętu nie nadąża nad rozwojem frameworków i języków, a na webdev to szkoda słów, strony potrafiące zjadać więcej niż gry w 3d, i działające od nich wolniej, ech..."

Do rozwoju trzeba dorosnac jak do wszystkiego.

Przypominam ze gdyby ludzkosci zalezalo na milisekundach zostalibysmy przy jakims jezyku maszynowym czy cus..  xD  xD  xD

 

Rowniez tutaj rozmawiamy o javie nie o minecrafcie, i daje se reke obciac ze chocbym zrobil tam 10 streamow naraz robiace to samo, gwarantuje Ci ze przy 400 graczach nic sie nie zmieni przy move i tak to wytrzyma i tak :)

 

Najlepiej cofnij sie do 1.3 Javy czy cus, bo przeciez nowe rzeczy sa nie wydajne !fisabroiwqbiurwqbi

 

jezu co za glupoty na tym forum..

 

nie zamierzam juz odpowiadac szkoda mojego czasu.

 

@Edit

Aby wykonczyc temat i juz dobic do sedna twoja bzdurna teorie obecnie liczy sie tylko:

CZYTELNOSC KODU

CZAS PROGRAMISTY

(Napewno jebnac 3 filtry niz 3 ify jest szybciej)

Apropo streamow i lambd, dlaczego ludzie zaczeli uzywac scali?

Bo wydajnosc?

Nie, scala oferowala wiecej rzeczy kosztem mniejszego nakladu :)

<18:17:02> "MarmarukHD" został zablokowany permanentnie na serwerze przez "Otek" (Teamspeak przeznaczony dla ludzi.)

Opublikowano

eeech.

Zacznijmy od tego ze stream naprawde rzuca sie ladnie w oczy i da sie szybko polapac o co chodzi, przy 3-4 ifach w petli juz tak ladnie to nie wyglada.

tak, i sam pisałem że wtedy warto użyć streamu, tutaj masz pętlę i 1 ifa, nie ma po co użyć streamu.

Jesli Cie irytuje przez to ze mowie prawde, twoj problem.
Wprowadzasz ludzi w blad wiec z tym sie bede klocil.

No widzisz, mamy ten sam cel :)

Skoro tak bardzo Ci zalezy na wydajnosci i kazda milisekunda dla Ciebie jest wazna polecam sie przerzucic na jakis jezyk natywny bo licza sieA 49O8I321BW8954BRUIWAZABE98B5R943219BOI45 MILIIISEKUNDYDYYDYDYDYDY
 
Polecam rowniez odpsucic sobie glowny replace bo jest nie wydajny przeciez! MILISEKUNDY
Rowniez rzuc obiekty bo sa przeciez nie wydajne !
No idiotyzm 21 wieku, to juz nawet nie jest smieszne to co mowisz, wrecz zalosne.

I znowu przypominam że to temat dotyczący minecrafta, tu się liczy wydajność ;) I tak właściwe to prawie nie używam .replace w javie jak pisze pod bukkita, jest w bukkie wbudowane apache.commons, więc StringUtils.replace i już mi to w nawyk weszło.

A język natywny wcale nie musi być szybszy, JIT potrafi zdziałać cudza, a JVM potrafi zdziałać cuda jeśli chodzi o szybką alokacje obiektów, jak by w cpp ręcznie robić new Costam tak często jak w apkach z javy, to by wydajnośc poszła na ryj.

Przypominam ze gdyby ludzkosci zalezalo na milisekundach zostalibysmy przy jakims jezyku maszynowym czy cus..  

Nie, bo w maszynowym znacznie trudniej kontrolować wydajność, nie opłaca się, zbyt dużo czasu by napisać kod, a stworzenie optymalnego jest bardzo trudne i skomplikowane, zdecydowanie lepiej użyć języka wyższego poziomu, jak c++ czy nawet takich z JIT-em i VM, tylko ich już trzeba umieć używać by dobrze wybrac między wydajnością a czasem pisania.

Najlepiej cofnij sie do 1.3 Javy czy cus, bo przeciez nowe rzeczy sa nie wydajne !fisabroiwqbiurwqbi

Ech, wiesz ty cokolwiek o javie? Starsze javy były zdecydowanie wolniejsze, w takiej 1.8 mamy możliwość wykonywania metod przez refleksje z wydajnością nawet szybszą niż direct, w takiej starej javie, refleksje były tak powolne że nie dało się ich bezpiecznie używać.

Aby wykonczyc temat i juz dobic do sedna twoja bzdurna teorie obecnie liczy sie tylko:
CZYTELNOSC KODU
CZAS PROGRAMISTY
(Napewno jebnac 3 filtry niz 3 ify jest szybciej)

I znowu te pierdolenie, ech, czytaj przynajmniej co się do ciebie pisze, jeszcze raz:

Nie ma sensu używać streama by zastąpić jednego ifa, JEST sens kiedy ifów i pętli jest więcej, bo tak jak napisałeś, liczsy się czytelność i czas programisty, ale wydajność też się liczy....

Niektóre strony na procesorze i7 potrafią ładować się kilka sekund, podobnie z niektórymi programami...

Trzeba zawsze znaleźć kompromis, tak by się nie narobić, a kod miał sensowną wydajność, a pętla z 1 ifem, kontra stream, to ten sam czas pisania, z IDE nawet pętlę często można zrobić szybciej, a kod jest czytelny.

 

I dalej są miejsca gdzie wydajność się BARDZO liczy, nie napiszesz z takimi wodotryskami programu do np obrabiania zdjęc, czy kompresji danych, tutaj potrzeba szybkiego kodu i operowania na byte[], do tego dochodzi właśnie GameDev, gdzie masz ograniczony czas w którym musisz się zmieścić, tutaj już masz więcej luzu niż w zabawie z byte[], ale dalej musisz znaleźć odpowiednie połączenie, tak by potem przy 30 graczach się nie okazało że serwer nie wyrabia.

Apropo streamow i lambd, dlaczego ludzie zaczeli uzywac scali?

Jedni wybrali, inni nie wybrali, wiele np woli języki typu Kotlin niż Scala, bo są... uwaga, czytelniejsze, i łatwiej je łączyć z istniejącym kodem w javie.

Jak widać czytelność to w dużej części tylko kwestia gustu ;) I nikt mi nie powie że 2 linijkowa pętla jest nieczytelna.

 

 

 

Może tym razem przeczytaj co się do ciebie pisze i nie wymyślaj teori o 3 ifach gdzie nic takiego nie pisałem? No i poducz się o tym jak działają języki skoro proponujesz javę 1.3 lub assemblery.

1438614356923701010629.png

 

Opublikowano

A mogliby panowie podać przykład tych streamow i w jaki sposób to działa? Może uda mi się jakoś połapać  ^^

.stream z kolekcji, np List itd, tworzy właśnie stream do którego następnie dodajesz akcje, bardzo ważne to by wiedzieć że streamy są wykonywane dopiero gdy skończysz go konstruować, czyli użyjesz jeden z kończących metod - tych co nie zwracają już streama.

Np masz kolekcje graczy na serwerze:

Collection<? extends Player> players = ...
players.stream() // tworzymy stream
    .peek(p -> p.setHealth(p.getMaxHealth())) // następnie chcemy kaźdemu graczu ustawić hp na maxa
    .fliter(p -> p.hasPermission("some.pex")) // teraz filtrujemy stream wybierając graczy z permission
    .peek(Player::closeInventory) // zamykamy tym co mają permissions EQ, Player::closeInventory to odpowiednik tutaj p -> p.closeInventory() na dole wyjaśnię więcej
    .flatMap(p -> SomePlugin.getRegions(p).stream()) // wyobraźmy siobie że mamy plugin SomePlugin który dosaje działki graczy, i teraz pobieramy dla każdego gracza Collection<Region> - listę jego działek, i flatMap sprawia że teraz mamy jeden Stream<Region>, czyli stream wszystkich regionów graczy z tym permission.
    .map(r -> r.getOptions()) // zmieniamy typ streamu, czyli dla każdej działki, pobieramy obiekt opcji, i teraz mamy Stream<RegionOptions>
    .forEach(r -> r.giveBonus()); // lub RegionOptions::giveBonus, forEach zwraca void i to już koniec streama, teraz te operacje się wykonają. 

Jak widać dla większych operacji jest to po prostu piękne rozwiązanie, mniej kodu i szybciej można napisać :P wyobraź sobie to wszystko na pętlach i ifach.

 

A teraz lambdy, bo jak widzisz są tam takie dziwne p -> p.costam(), lambdy opierają się na interfejsach, każdy interfejs z jedną metodą do implementacji można używać jako lambdy, np:

interface Runnable
{
    void run();
}

w javie 7 jak chcieliśmy użyć runnable to musieliśmy tworzyć nową klasę, całą, lub taką anonimową:

jakaśMetodaPrzyjmującaRunnable(new Runnable(){

@Override
public void run() {
    Bukkit.shutdown();
}

})

w javie 8... można to zrobić tak:

jakaśMetodaPrzyjmującaRunnable(() -> Bukkit.shutdown())

metody od lambd mogą coś też zwracać, lub przyjmować, np:

interface Function<A, B>
{
   A apply(B ;
}

wtedy już mamy lambdę:

b -> b.makeA()

jeśli argumentów jest więcej trzeba dodać nawiasy:

(arg1, arg2) -> ...

można też podawac typy

(String arg1, Boolean arg2) -> ...

A te takie fajne Player::closeInventory to tak zwane method references, ogólnie wtedy java jakby sama przekazuje argumenty z lambdy, do tej metody, np mając metodę:

metoda(Function<Player, Inventory> getEqFunc)

i chemy ją wykonać możemy zrobić:

metoda(Player::getInventory)

i java to traktuje jako (no nie do końca, ale w uproszczeniu)

metoda(p -> p.getInventory())

można też działać tutaj na innych obiektach, ale to polecam doczytać więcej tutaj:

https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

 

 

Pisane bez IDE więc sorka za formatowanie i jakieś mniejsze błędy :D

1438614356923701010629.png

 

Opublikowano

Dzięki mistrzu :D Troche się rozjaśniło bo na internecie czytałem to nic prawie nie mogłem zrozumieć xD

 

Streamy i lambdy zwiększają tylko czytelnośc kodu czy też może jego wydajność?

Opublikowano

 

Dzięki mistrzu :D Troche się rozjaśniło bo na internecie czytałem to nic prawie nie mogłem zrozumieć xD

 

Streamy i lambdy zwiększają tylko czytelnośc kodu czy też może jego wydajność?

to jak pisałem wyżej, zależy... czasami można sobie popsuć czytelność, bo np jeśi lambda wywala wyjątek, to nie da się go złapać za lambdą, tylko trzeba w środku:

 

try
{
collection.stream().filter(p -> p.cosCoRzuczaWyjątkiem())
} catch(TenWyjątek e){
throw new Costam(e);
} 

to nie zadziała, co może być problematyczne, trzeba wtedy to rzucać do lambdy, co nie zawesze jest możliwe/wygodne a do tego wygląda jak gówno:

collection.stream().filter(p -> 
    {
    try{
    return p.cosCoRzuczaWyjątkiem();
    } catch....
    }
);

więc trzeba dobrać do sytuacji, ogólnie mają pewien narzut wydajnościowy, w eventach jak PlayerMove lepiej się dobrze zastanowić czy nie można zrobić tego w miarę wygodnie pętlą, w komendach np raczej nie ma co się przejmować, ale też nie ma sensu zastępować każdego ifa streamem, czasem szybciej i czytelniej będzie to zrobić po staremu.

PlayerMove wykonuje się nawet co tick dla wszystkich graczy, czasem nawet częściej, więc każda ms jest tutaj na wagę złota.

 

 

a niektóre operacje mogą być szybsze, jak arrayList.removeIf kiedy usuwamy wiele elementów z dużej listy da nam SPORY zysk.

 

 

Zawsze trzeba dobrać rozwiązanie do sytuacji.

1438614356923701010629.png

 

Opublikowano

@GotoFinal

 

"tak, i sam pisałem że wtedy warto użyć streamu, tutaj masz pętlę i 1 ifa, nie ma po co użyć streamu."

Jak juz uzywamy streamow, to trzymajmy sie ich w kodzie, albo uzywasz albo nie.

 

"No widzisz, mamy ten sam cel  :)"

Twoj cel to obrona jakiegos polglowka ktorego zjechalem slusznie.

Ten dzial i tak nie zyje, jesli chcemy go utrzymac w dobrym stanie, naprawde robmy to dajac z siebie 110% ;)

 

"I znowu przypominam że to temat dotyczący minecrafta, tu się liczy wydajność  ;) I tak właściwe to prawie nie używam .replace w javie jak pisze pod bukkita, jest w bukkie wbudowane apache.commons, więc StringUtils.replace i już mi to w nawyk weszło."

A ja Ci przypominam znow ze to dzial JAVA, nie minecrafta.

Apropo replace, nie zrozumiales ;)

 

"A język natywny wcale nie musi być szybszy, JIT potrafi zdziałać cudza, a JVM potrafi zdziałać cuda jeśli chodzi o szybką alokacje obiektów, jak by w cpp ręcznie robić new Costam tak często jak w apkach z javy, to by wydajnośc poszła na ryj."

Zazywczaj natyw jest szybszy, ale to tez nie temat do dyskutowania :)

 

"Nie, bo w maszynowym znacznie trudniej kontrolować wydajność, nie opłaca się, zbyt dużo czasu by napisać kod, a stworzenie optymalnego jest bardzo trudne i skomplikowane, zdecydowanie lepiej użyć języka wyższego poziomu, jak c++ czy nawet takich z JIT-em i VM, tylko ich już trzeba umieć używać by dobrze wybrac między wydajnością a czasem pisania."

A, czyli jednak liczy sie czas programisty ! 

Beka gotofinal, sam nie wiesz co piszesz przez ostatnie posty.

 

"Ech, wiesz ty cokolwiek o javie? Starsze javy były zdecydowanie wolniejsze, w takiej 1.8 mamy możliwość wykonywania metod przez refleksje z wydajnością nawet szybszą niż direct, w takiej starej javie, refleksje były tak powolne że nie dało się ich bezpiecznie używać."

Nie wiem czy chciales tutaj zablysnac, ale naprwade przeczytaj to zdanie 2-3 razy i domyslisz sie ze to byl sarkazm.

 

"znowu te pierdolenie, ech, czytaj przynajmniej co się do ciebie pisze, jeszcze raz:

Nie ma sensu używać streama by zastąpić jednego ifa, JEST sens kiedy ifów i pętli jest więcej, bo tak jak napisałeś, liczsy się czytelność i czas programisty, ale wydajność też się liczy....

Niektóre strony na procesorze i7 potrafią ładować się kilka sekund, podobnie z niektórymi programami...

Trzeba zawsze znaleźć kompromis, tak by się nie narobić, a kod miał sensowną wydajność, a pętla z 1 ifem, kontra stream, to ten sam czas pisania, z IDE nawet pętlę często można zrobić szybciej, a kod jest czytelny.

I dalej są miejsca gdzie wydajność się BARDZO liczy, nie napiszesz z takimi wodotryskami programu do np obrabiania zdjęc, czy kompresji danych, tutaj potrzeba szybkiego kodu i operowania na byte[], do tego dochodzi właśnie GameDev, gdzie masz ograniczony czas w którym musisz się zmieścić, tutaj już masz więcej luzu niż w zabawie z byte[], ale dalej musisz znaleźć odpowiednie połączenie, tak by potem przy 30 graczach się nie okazało że serwer nie wyrabia."

Rozmawiamy o mpcforum.. xD oni tuta makr nie znaja, ani skrotow klawiszowych w intellji, to pierdolniemy se jeszczce tutaj streama tam ifa tam get'a a c**j tam, jakos to bedzie "byle by dzialalo"

Ale co ma playermoveevent o gamedevu, bo gwarantuje Ci wciaz ze moge tam wpierdolic 30 streamow i tak sie wyrobie w czasie :)

Przypominam Ci rowniez ze jako jedyny w polsce utrzymalem 670++ osob na 1 spigocie, gowno survival na 20 tpsach i smiem powiedziec ze dobilbym 800 na syf spigocie.

Podczas gdy inni, albo ludzie ktorzy uzywaja dzis twojego autoina maja problem z utrzymaniem 100 osob na 19 tps xD

Nie oskarzam autoina, aczkolwiek mam na mysli ze jesli juz rozmawiamy o wydajnosci to miej z nia stycznosc :p

 

"Jedni wybrali, inni nie wybrali, wiele np woli języki typu Kotlin niż Scala, bo są... uwaga, czytelniejsze, i łatwiej je łączyć z istniejącym kodem w javie.

Jak widać czytelność to w dużej części tylko kwestia gustu  ;) I nikt mi nie powie że 2 linijkowa pętla jest nieczytelna."

Kotlin "zgasl" juz bardzo dawno, i nie znam naprawde fizycznej osoby ktora go uzywa, zainteresowanie scala wciaz rosnie wiec cos jest na rzeczy :)

 

 

Nic do Ciebie prywantnie GTF nie mam juz powiedzialem, ale chec bronienia kolegi jest po prostu nie fer, sam widzisz ze autor sie zainteresowal streamami dlaczego ich nie uczyc nowych rzeczy? 

Nie wiem, wygryza Cie ze sceny? 

Czy jak? nie rozumiem.

Wspierajmy jave 8 bo warto :)

I tak, streamy sa czytelniejsze nawet w 1 ifie.

<18:17:02> "MarmarukHD" został zablokowany permanentnie na serwerze przez "Otek" (Teamspeak przeznaczony dla ludzi.)

Opublikowano

@de76

A, czyli jednak liczy sie czas programisty !

Nic nie ujmując logice zero-jedynkowej, czasem warto poza nią wyjść. Liczy się i czas programisty, i czas wykonania. I to, i to generuje koszty. Ich optymalny stosunek jest zależny od przypadku. Streamy potrafią być kilkanaście razy wolniejsze od iteratorów i umieszczanie ich w krytycznym miejscu programu, gdzie będą operować dużo razy na małych listach, oszczędziłoby kilka minut programiście, a program działałby odczuwalnie wolniej. Nie ma co ich idealizować.

 

@mateusz2173

 Streamy i lambdy zwiększają tylko czytelnośc kodu czy też może jego wydajność?

Mogą poprawić wydajność jeśli użyjesz parallelStream, czyli Streama pozwalającego na równoległe wykonywanie operacji. Stream równoległy ma sporo większy narzut obliczeniowy związany z inicjalizacją i samym przetwarzaniem, więc z nim też należy uważać i używać tylko w konkretnych przypadkach, czyli gdy masz dużo elementów na których wykonujesz czasochłonne operacje, które da się wykonywać asynchronicznie. Kolejny plus Streamów, związany właśnie z asynchronicznością, to to, że są immutable, czyli przy każdej operacji nie modyfikujesz go tylko tworzysz nowego. W ten sposób nie musisz przejmować się synchronizacją, co poprawia czytelność i wydajność.

708121422388637873334.png

Opublikowano

@de76

A, czyli jednak liczy sie czas programisty !

Nic nie ujmując logice zero-jedynkowej, czasem warto poza nią wyjść. Liczy się i czas programisty, i czas wykonania. I to, i to generuje koszty. Ich optymalny stosunek jest zależny od przypadku. Streamy potrafią być kilkanaście razy wolniejsze od iteratorów i umieszczanie ich w krytycznym miejscu programu, gdzie będą operować dużo razy na małych listach, oszczędziłoby kilka minut programiście, a program działałby odczuwalnie wolniej. Nie ma co ich idealizować.

 

@mateusz2173

 Streamy i lambdy zwiększają tylko czytelnośc kodu czy też może jego wydajność?

Mogą poprawić wydajność jeśli użyjesz parallelStream, czyli Streama pozwalającego na równoległe wykonywanie operacji. Stream równoległy ma sporo większy narzut obliczeniowy związany z inicjalizacją i samym przetwarzaniem, więc z nim też należy uważać i używać tylko w konkretnych przypadkach, czyli gdy masz dużo elementów na których wykonujesz czasochłonne operacje, które da się wykonywać asynchronicznie. Kolejny plus Streamów, związany właśnie z asynchronicznością, to to, że są immutable, czyli przy każdej operacji nie modyfikujesz go tylko tworzysz nowego. W ten sposób nie musisz przejmować się synchronizacją, co poprawia czytelność i wydajność.

parallel stream jest też problematyczny... zjebali go po całości, można używać do prostych operacji, ale nigdy do żadnego kodu gdzie używamy jakiś blokującyh operacji, a tym bardziej locków, można łatwo zrobić sobie dead locka, parallel stream korzysta z jednego poola, o stałej wielkości (można ją zmienić argumentem, lub odpalając strema w osobnym wątku z innego fork-join poola, co jest oczywiście problematyczne), więc wyobraźmy sobie że mamy 2 osobne miejsca w kodzie, jedno odpala parallel streama i gdzieś po drodze się okazuje że niektóre z tasków muszą poczekać na coś, teraz w innym wątku, w innym miescu, odpala się parallel stream wykonujący jakieś operacje i który zwolni te czekające wątki i... nagle się okazuje że już nie ma miejsca w poolu, i c**j :D parallel streamy tak właściwe są fajne tylko do jednowątkowych operacji, i małych, bo inaczej musisz czekać na inne jeśli wykorzystają wszystkie wątki.

A mogli dodać możliwość określenia własnego poola i byłaby to świetna zabawka ;/ w Projekcie raz zmieniłem kilka mechanizmów z fork-join na streamy parallel, czas wykonania to chyba kilkukrotnie podskoczył z powodu walczących o siebie wątków.

Ale przydatne do programików na szybko.

Jak juz uzywamy streamow, to trzymajmy sie ich w kodzie, albo uzywasz albo nie.

toż to nie ma żadnej logiki jak @Jaca777 napisał, tak samo używasz tylko 1 typu kolekcji w kodzie? Tylko jednego rodzaju pętli?

Twoj cel to obrona jakiegos polglowka ktorego zjechalem slusznie.

nie, mój cel to napisanie prawdy.

A ja Ci przypominam znow ze to dzial JAVA, nie minecrafta.

a co mnie obchodzi jaki to dział? jak ktoś by się pomylił i zadał to w kulinarnym to mu napiszesz by pokroił cebulkę streamami?

Pytanie dotyczy mc, autor udziela się gównie tam, więc szanse że chodzi o czystą javę są znikome...

A, czyli jednak liczy sie czas programisty ! 
Beka gotofinal, sam nie wiesz co piszesz przez ostatnie posty.

od początku pisze to samo, ze liczy się czas wykonania ORAZ czas programisty... ech, dalej nici z czytania.

Rozmawiamy o mpcforum..  oni tuta makr nie znaja, ani skrotow klawiszowych w intellji, to pierdolniemy se jeszczce tutaj streama tam ifa tam get'a a c**j tam, jakos to bedzie "byle by dzialalo"
Ten dzial i tak nie zyje, jesli chcemy go utrzymac w dobrym stanie, naprawde robmy to dajac z siebie 110% 

to w końcu 110% czy traktować jak gówno co nic nie potrafi?

Nic do Ciebie prywantnie GTF nie mam juz powiedzialem, ale chec bronienia kolegi jest po prostu nie fer, sam widzisz ze autor sie zainteresowal streamami dlaczego ich nie uczyc nowych rzeczy? 
Nie wiem, wygryza Cie ze sceny? 
Czy jak? nie rozumiem.

WTF? Przecież nawet zrobiłem mu mały uproszczony poradnik, tylko chce by wiedział kiedy tego używać... a kiedy lepiej na to uważać.

Kotlin "zgasl" juz bardzo dawno, i nie znam naprawde fizycznej osoby ktora go uzywa, zainteresowanie scala wciaz rosnie wiec cos jest na rzeczy 

Kotlin to się właśnie dopiero zaczyna rozgrzewać, i pojawia się go coraz więcej i coraz szybciej, a ludzi też widzę coraz więcej, ostatnio nawet LWJGL sporo kodu przemieliło na kotlina, piękny język bo dalej w pełni kompatybilny z javą, w obie strony, po kompilacji scali powstaje taki pierdolnik w bytecode że lepiej z poziomu javy tego nie dotykać.

Tak samo popularnym językiem jest groovy, ale to bardziej taka java skryptowa, ale też ma ciekawe zastosowania.

Ale co ma playermoveevent o gamedevu, bo gwarantuje Ci wciaz ze moge tam wpierdolic 30 streamow i tak sie wyrobie w czasie 
Przypominam Ci rowniez ze jako jedyny w polsce utrzymalem 670++ osob na 1 spigocie, gowno survival na 20 tpsach i smiem powiedziec ze dobilbym 800 na syf spigocie.

ograniczając entity i mapę spokojnie można dużo dobić, ale co z tego jak rozgrywka wtedy jest do niczego, widziałem, wolę nie wracać.

Co do autoina.... autoin to jest syf ;) zgodnie z wolą autora, miało być w pełni closed source i utrudnione do dekompilacji, i tak zostało zrobione, nie mam zamiaru tego rozwijać itd.

A problemem nie było obciążenie tylko limity zapytań, a cache to jednak średnio dobre rozwiązanie tutaj, pomaga, ale może też popsuć.

A masa streamów obniży wydajność jeśli zostanie użytwa w takim miejscu... 670 graczy, każdy się porusza, nie masz nawet 1ms, zostają ci tylko jakieś tysiące/dziesiątki tysięcy nano sekund, tutaj trzeba optymalizować...

w komendach itd, można robić co się chce, one nie są tak często wykorzystywane, ale są miejsca gdzie o wydajność trzeba dbać i tyle.

 

I taka ciekawostka

 

 

W spigocie nawet zmieniają strukturę obiektów by zwiększyć wydajność mapy, bo wiedzą że to jeden z ważniejszych elementów, a co zmienili? sprawili że zamiast 2 getterów, jest tylko 1.

class SomeClass
{
abstract int getA();
}
class SomeClassA
{
int a;
int getA() {return a;}
int setA(int a) {this.a = a;}
}
class SomeClassB // immutable
{
final int a; 
int getA() {return a;}
}

Zmienili na:

class SomeClass // immutable
{
    int a;
    int getA() {return this.a;}
}
class SomeClassA // mutable
{
    int setA(int a) {this.a = a;}
}

i już działa kilka % szybciej, bo JIT potrafi to znacznie lepiej zoptymalizować, szybsze o ~30%, obiekt był używany prawie wszędzie, w każdym ticku po kilka tysięcy, i więcej, razy, więc dało to efekt.

 

 

I tak, streamy sa czytelniejsze nawet w 1 ifie.

i to już tylko kwestia gustu...

1438614356923701010629.png

 

Opublikowano

po kompilacji scali powstaje taki pierdolnik w bytecode że lepiej z poziomu javy tego nie dotykać.

W 2.11 i wcześniej - tak, po wydaniu 2.12 traity kompilują się normalnie (tj. tak jak Java), tak samo wszystkie inne funkcyjne rzeczy. Da się ich razem używać.

 

A mogli dodać możliwość określenia własnego poola i byłaby to świetna zabawka

Raczej taki jest właśnie zamysł tych streamów równoległych - proste obliczenia bez side effectów. Moim zdaniem to, że nie rozbudowali tego bardziej, ma sens. Stworzenie 'pełnoprawnego' narzędzia do obliczeń równoległych mogącego konkurować z innymi na rynku wymagałoby kupy pracy, a umieszczanie tego w bibliotece standardowej byłoby całkowicie pozbawione sensu. Po zrobieniu sensownego zarządzanie poolami wątków i zadaniami ludzie przyczepiliby się do braku możliwości ogarniania backpressure, rozpraszania (tu zrodziłoby się kolejne milion problemów), itd. Szybkie przetwarzanie danych to temat bardzo rozległy, a oni po prostu nie chcieli w to wchodzić i postawili jasną granice zastosowania Streamów. Jeśli ktoś chce więcej, to niech se weźmie Sparka czy chociaż Rx.

708121422388637873334.png

Opublikowano

 

po kompilacji scali powstaje taki pierdolnik w bytecode że lepiej z poziomu javy tego nie dotykać.

W 2.11 i wcześniej - tak, po wydaniu 2.12 traity kompilują się normalnie (tj. tak jak Java), tak samo wszystkie inne funkcyjne rzeczy. Da się ich razem używać.

 

A mogli dodać możliwość określenia własnego poola i byłaby to świetna zabawka

Raczej taki jest właśnie zamysł tych streamów równoległych - proste obliczenia bez side effectów. Moim zdaniem to, że nie rozbudowali tego bardziej, ma sens. Stworzenie 'pełnoprawnego' narzędzia do obliczeń równoległych mogącego konkurować z innymi na rynku wymagałoby kupy pracy, a umieszczanie tego w bibliotece standardowej byłoby całkowicie pozbawione sensu. Po zrobieniu sensownego zarządzanie poolami wątków i zadaniami ludzie przyczepiliby się do braku możliwości ogarniania backpressure, rozpraszania (tu zrodziłoby się kolejne milion problemów), itd. Szybkie przetwarzanie danych to temat bardzo rozległy, a oni po prostu nie chcieli w to wchodzić i postawili jasną granice zastosowania Streamów. Jeśli ktoś chce więcej, to niech se weźmie Sparka czy chociaż Rx.

 

ale nawet do prostych rzeczy można sobie narobić problemów, np chce się pobrać równolegle kilka plików, i dupa, parallel stream się do tego nie nadaje, a nawet do prostych rzeczy może być problematyczny bo nigdy nie wiesz czy to się wykona szybciej, bo może właśnie inny wątek używa streama i blokuje wszystkie inne wątki które chcą go użyć ;/

I tak właściwe to jest jedyne rozwiązanie... tylko rakowe:

https://gist.github.com/GotoFinal/c2a0fdee1b80d5956121fa9ccb6e2239

1438614356923701010629.png

 

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...