Hogyan tovább? JAVA és C#
2013-02-07T21:46:57+01:00
2013-02-11T14:55:05+01:00
2022-07-23T15:42:44+02:00
  • Az C/C++ nyelv a mély víz. Ha az profin megy akkor ! nyelvi ! szinten a Java-ra váltás már egy laza sétagalopp. Ugyanakkor felmerülhet a kérdés hogy a könnyebb nyelv felől érdemes a nehezebb felé közelíteni vagy fordítva. Nekem jelenleg sokat segít a C++ megismerésében a Java nyelv alapos ismerete. A C#-ot nem ismerem.
    Mutasd a teljes hozzászólást!
  • az én tapasztalatom pont az, hogy ne erőltesd a GC-t.
    Hagyni kell, hogy a rendszer magától csinálja.

    7/24 rendszerekben rengeteg időt szántam rá, hogy ellenőrizzem, érdemes-e új modul betöltés előtt GC takarítást kérni.
    Segíteni nem segített, viszont furcsa lagolások megjelentek időnként. Legvégül elvetettem.
    Simán megy akadás nélkül pedig néhány mega-giga biztos átfolyik rajta naponta.

    3D esetén csak ferdített igazságot tudok mondani.
    Mivel a kijelző alá kértem vasat is, ezáltal minden befért egyszerre a memóriába.
    Persze így is volt meló rendesen az optimalizálással.
    Kb 20 perc elteltével a GC 100 másodpercenként brutális lagolást csinált nekem.
    Gyors teszt után kiderült, GC0 egy másodpercenként GC1 10mp, GC2 100 mp lefutott egyszer.
    Na ezt vittem le annyira, hogy az első GC2 kb 6óra után jött.

    Szvsz. sokkal inkább érdemes az optimalizálásra törekedni, mint a GC-t piszkálni.

    Mutasd a teljes hozzászólást!
  • Meg mint említettem minden alkalommal, amikor te mint programozó tudod, hogy a gép kihasználatlan, nem sürgős semmi, ugyanakkor valami újba vágsz bele, ami miatt tudod, hogy a továbbiakban a nem hivatkozott foglalások feleslegesek, jönnek helyette új dolgok, ami miatt bizonyára előbb-utóbb lesz egy auto GC.

    Ez ennyire egyszerű

    "Mert ha korábban is egy hasonló sql adatok voltak bent, és mire megjön az új data, a gc kipucolja"


    Ezzel a mondatoddal nem tudtam mit kezdeni.
    Ha kell, akkor van rá referenciám, ha nem kell, akkor nincs és had vesszen, adjon teret az új adatoknak.

    Pl. tipikus ha ORM-et használsz és eldobod az előző beolvasás tartalmát mert új, teljesen más (ill. friss) adatokkal akarsz dolgozni. Ugyanaz mint grafikánál.
    És amíg a grafikánál a háttérben sok lemezműveletet végzel, addig logikus egy GC, addig az SQL lekérdezés ideje alatt is logikus egy GC, hogy eltakarítsa az előző lekérdezés objektum hegyeinek maradékát.
    Mutasd a teljes hozzászólást!
  • Csak kérdés, hogy mit nyersz vele? Mert ha korábban is egy hasonló sql adatok voltak bent, és mire megjön az új data, a gc kipucolja, akkor bukó van (újrahasznosítás kevesebb költség, mind a felszabadít lefoglal).

    A stackoverflow-n is ezt az egy esetet említették, hogy sok adat bufferelése után (textúra modell betöltés pont ilyenek) érdemes gc-zni.
    Mutasd a teljes hozzászólást!
  • Csak egy hirtelen ötlet, akár egyszerű ügyvitelnél is.

    Ha a felhasználó kér egy hosszabb SQL lekérdezést vagy feldolgozást, akkor azt ugye illik másik szálon futtatni és a főszálban egy folyamatjelzőt (legalábbis valami mocorgót, hogy ne fo...on a várakozás alatt) megjelentetni.

    Ez pl. nagyon alkalmatos időpont egy teljesen felesleges extra GC elindításra.

    Elindítani nem téma és ha már úgyis pl. az SQL szerverre vár a progi, akár ki is használhatja az időt.
    Mutasd a teljes hozzászólást!
  • Minden esetben az a fő kérdés, hogy mennyire érti a programozó a környezete belső működését.

    Pl. a C++ alapok azért is jók, mert egy C#/Java programozó ekkor kevésbé hajlik halott hivatkozásokat fenntartani (vagyis nem használja ki sehol, de ettől még létezik(!) a hivatkozás).
    Jobban a "vérében van" erre figyelni.

    A GC hívása pedig eszementen egyszerű kérdés.
    Ha tudsz olyan időpillanatot (egyszerűen a feladatot kézben tartod, és te irányítasz), akkor kiválaszthatsz legalkalmasabb helyzetet, amikor futtatod.

    Vagyis a tiltás hülyeség.
    Ha kérdéses erre optimalizálni (egy számlázónál kevéssé), akkor minden esetben jobb döntés, ha te irányítasz, nem pedig a háttérben "véletlenül" indul el egy folyamat.
    Mutasd a teljes hozzászólást!
  • Írtam már játékot (GLES1.X), és én is ezt csináltam, ezért tudom, hogy lenne erre más megoldás is. Amúgy általában a "new" kulcs-szó miatt van az, hogy a játékok nem szeretik ezt a vonalat.

    Játék közben csinálsz egy rakat objektumot, meg törlöd, ilyesmik, amiket aztán újra lehetne hasznosítani. (sztem)

    Nekem a képekkel nem volt gondom. Bár ez android...és saját 3d engine.

    Amúgy pedig: nincsenek a programozásban örök érvényű szabályok szerintem, attól függ, hogy mi az amit programozol, mert akkor azt úgyis máshogy kell megírni.

    Máshogy írsz játékot, ahol számít minden egyes ms, és máshogy egy alkalmazást is.

    Pl. Java-ban gyönyörűek a getter/setterek, a Dalvik VM pedig nem szereti őket, ez is lassít rajta. Ezért általában a csúnya mValtozo=gipszjakab elérése gyorsabb.

    http://developer.android.com/training/articles/perf-tips.html#intern..

    szóval van ahol simán el kell hagyni a "common practise"-eket a performanciáért. :)
    Mutasd a teljes hozzászólást!
  • System.gc()-t nem szabad meghívni, ez alap


    Tudom, hogy most a Stackoverflow-val fogok vitatkozni, de vannak esetek, amikor a GC manuális meghívása kifejezetten hasznos.

    Egy példa, igaz nem Java hanem C#, azon belül is XNA:
    Amikor pl. új játékot kezdesz, "best practice" előre betöltögetni azokat a tartalmakat (textúrák, hangok stb) amiket az adott pályán használni fogsz. Ilyenkor gyakran előfordul, hogy a töltögetés végére keletkezik egy rakás szemét is a memóriában. Ezeket idővel nyilván eltávolítaná a GC, viszont a GC-t egyáltalán nem akarjuk, hogy játék közben, 60 fps mellett elkezdjen takarítgatni. Ez XBox-on, Windows Phone-on nagyon zavaró röccenéseket, szaggatást eredményez. Ezért szokás a betöltési folyamat legvégén meghívni manuálisan a takarítást.

    Tudom, valamennyire szélsőséges példa... de nem csak C# / XNA fronton fordulhat elő. Az már más kérdés, hogy ha kerülgetni akarjuk a GC-t, akkor talán más nyelvet kéne használni (mondjuk C++-t).
    Mutasd a teljes hozzászólást!
  • System.gc()-t nem szabad meghívni, ez alap:


    Why is it bad practice to call System.gc()?


    Does setting Java objects to null do anything anymore?

    Setting references to null is the way you signal to the GC that you no longer need the object. the GC doesn't have to do anything about it immediately.

    és még néhány dolog:

    Avoiding memory leaks


    te meg olvasgass fórumokat:D


    De az is lehet, hogy az ilyen 'halott' objektum sosem takarodik ki a memóriából, mert előbb ér véget a program futása.


    azt kérlek szépen memory leak-nek hívják, az a gányolás:)
    Mutasd a teljes hozzászólást!
  • Szerintem Lacasrac erre célzott:
    an object becomes eligible for garbage collection if its all references are null.


    Mintha pont ezt mondta volna.. végül is ezután te már nem tudod elérni.

    De az is lehet, hogy az ilyen 'halott' objektum sosem takarodik ki a memóriából, mert előbb ér véget a program futása.


    A soha, meg a picivel később, az nem ugyanaz, kicsit gondold át :)
    Mutasd a teljes hozzászólást!
  • Akkor takarithat ki a GC valamit, ha te nem tudod sehogy sem elérni. (Semmilyen referenciád sincs már rá).


    Ez nem igaz, pl. Weak/SoftReference-en keresztul elerheto ojjektumot is kivaghat...
    Mutasd a teljes hozzászólást!
  • Felszabaditani a Javaban? Kurvára nem te döntöd el, hogy meddig él egy objektum és hogy a GC mikor fut le, mit szabadit fel, milyen sorrendben.
    A System.gc() is csak egy odaszólás a JVM-nek, hogy jó volna ha lefutnál, de nem kényszeríti őt ez még semmire.

    Akkor takarithat ki a GC valamit, ha te nem tudod sehogy sem elérni. (Semmilyen referenciád sincs már rá). De az is lehet, hogy az ilyen 'halott' objektum sosem takarodik ki a memóriából, mert előbb ér véget a program futása.

    Egyetlen egy garancia van: OOM előtt biztosan a GC mindent el fog követni hogy amit csak lehet kiszórjon és ha még így is kevés a történet, akkor jön az OOM.

    Az eszetlen nullozásoddal csak valamiféle más problémát próbálsz eltakarni. Olvasd el a specifikációkat, próbálj meg jól kódolni és ne terelj másokat a gányolás irányába.
    Mutasd a teljes hozzászólást!
  • hiába van GC, java-ban/androidban pl, akkor is nullozni kell dolgokat, meg clearelni, recycle-olni, mert különben a GC semmit se ér

    pont ezzel lehet nagyokat szívni, pl egy játékmotornál, volt egy srác sose szabadított fel semmit destroynál és motort írt, mert azt hitte a GC majd elvégzi mindenféle nullázás jelölés nélkül.., HÁT NEM feltétlen.

    egyébként sztem is c++->java c# ezek után gyerekjáték
    Mutasd a teljes hozzászólást!
  • Szerintem is.
    ma már az assembly-t nem javasolnám tanítani, de megmutatni-megismertetni kötelező.
    Én hiszek a történeti sorrendben haladás fontosságában. Ahogy történelemben is csak akkor lehet jó áttekintése valakinek, ha végighalad a fejlődés lépésein, úgy ez igaz az informatikára is.
    A processzor működését ismerni kell, ha tudni is akarja valaki mit is csinál. Enélkül szakbarbár marad, tehetséges betanított munkásig viheti.

    Vagyis az első kellően gépközeli és ember által jól érthető nyelven kell megismerni a működés valóságát.

    Aztán erre feltehetőek az egyes elvonatkoztatási rétegek, hogy érthető maradjon a működés.

    És persze a C --> C++ --> Java/C# lépcsők fontosak.

    Persze az már szakosodás kérdése, hogy melyikre fektet nagyobb súlyt valaki.
    A C (sőt, szetségtörés, az ASM is) létező, létjogosultsággal bíró technologia. Nem csak oktatási okokból, praktikusan is van értelme. Még munkaértéke is van, valós piaci szerepe.

    De természetesen a munkaerő piac is ennek megfelelően veszi fel az embereket.
    A legkevesebb ASM-ből, ennél több C, majd C++ végül a legtöbb a C#/Java szakiból szükséges.

    [Most nem emlegetem a PHP/JS tudást, az egy másik kérdés, más technologiai út, bár érdekes]

    Apró megjegyzés: egy jó C-s szaki is sokat tanulhat Java/C# tudásból. A magasabb szintek patternjei, megoldásai jótékonyak lehetnek egy C feladatnál, ha komoly méret, összetettség és robosztusság kell.
    Mutasd a teljes hozzászólást!
  • Szerintem meg inkább C. Ha a C-t jól tolod, akkor később egy C# vagy Java könnyen tanulható. Visszafelé viszont nem szokott menni. És hát a C a legtöbb programozási nyelv alapja. Nem utolsó sorban megszokod az erőforrás kezelést és a felszabadítást is. gc-s környezet után az emberek már nem szokták megszokni :)

    Persze ha mondjuk erp fejlesztő akarsz lenni, nem ez a legjobb út :)
    Mutasd a teljes hozzászólást!

  • n csak annyit mondanék, mikor elkezdtem JAVA programozni -4 éves C# tapasztalattal a hátam mögött- belezavarodtam szintaktikailag, szemantikailag, mindenhogy

    Az elég baj. Szerintem Java-t, Lua-t vagy bármilyen nyelvet elkezdeni pár óra, mert megnézed, hogy itt ilyen a for ciklus amott meg másmilyen ez statikus típusos amaz meg nem és kb ennyi. Itt csak a nyelvről van szó természetesen nem a hozzá tartozó framework-ről.
    Mutasd a teljes hozzászólást!
  • 1. Tanuld meg, azaz inkább kóstolj bele a C#-ba, Java-ba és C++-ba. Minimum fél év jusson 1-1 nyelvre. (Egyetem mellett bőven lesz időd).

    2. Találd ki, hogy milyen programokat készítenél szívesen. Desktopra, webre, szerver- vagy kliensoldalon fejlesztenél? Egy fäsza UI elkészítése, vagy inkább egy optimális algoritmus implementálása dobogtatja meg jobban a szíved? Grafika, üzleti logika, formok, workflow-k, adatbázis-menedzselés?

    3. Nézz utána, hogy az általad választott szakterületen mik a legmenőbb framework-ök, libraryk (package-ek). Mert sokszor nem nyelvre, hanem frameworkre / libraryre specializálódsz (ami persze általában a nyelvet is meghatározza).

    4. Válassz ki egyet, és ásd bele magad. Készíts valamit, ami komplett, működik, be van fejezve. Amit meg mersz majd mutatni a reménybeli főnöködnek (forráskóddal együtt).

    5. Válassz magadnak egy második szakterületet is. Irány a 3. pont.
    Mutasd a teljes hozzászólást!
  • Szerintem a C# és a Java között csak a technológiákban és a nézőpontban van különbség. Nekem nem okozott gondot a Java után C#-ra váltanom, sőt, egészen könnyen ment, csak néhány mélyebb dologban van még nekem is homály. De ezek nem leküzdhetetlen akadályok, csak utána kell olvasni és ki kell próbálni.
    Szerintem ha valaki ismeri a két platform közül az egyiket, akkor rövid időn belül látványos eredményeket fog tudni produkálni a másikban is. A nyelv majdnem hogy azonos felépítésű, ami húzósabb az a platformhoz tartozó technológiák felépítésének és helyes alkalmazásának a megtanulása.
    Én azt ajánlom, hogy kezdőként válaszd ki az egyiket, azt tanuld ki, fejlesz néhány egyéni ötletből először kisebb, majd nagyobb projekteket, így néhány éves tapasztalat után már könnyebben fogod tudni a másik platform sajátosságait megtanulni.
    Én Java-val kezdtem, de talán a C# könnyebben tanulható, ezért én azt tanácsolom, hogy kezdj a .NET-el ismerkedni (C#), mert a Java a túl nagy technológiai kínálata miatt kicsit nehezebben tanulható. De ez csak egy saját vélemény.
    De az igaz, hogy a jelenleg ez a két platform az, amelyik a munkaerőpiacon a legkeresettebb. (A PHP és a C++ mellett. Csak ameddig a PHP programozók zsákszámra vannak, addig a jó C++ programozókból igen ritka a "kínálat". Ezért ez is egy jó út lehet a jövőre nézve.)
    Mutasd a teljes hozzászólást!
  • ha kérdésed merülne fel, akkor kérdezd angolul

    pl. stackoverflow.com

    ezáltal fórumozni is megtanulsz, meg google-zni, stb, meg angolul is, ami a programozás nyelve. plusz megtanulsz angol kifejezéseket is. aztán később code.google-n, meg githubon haverkodsz külföldiekkel, etc

    a magyar fordítások meg általában hülyén hangzanak magyar könyvekben, aztán ha meglátod angolul, lövésed se lesz, hogy az mi. :)

    nálam is ez volt, csak éppen magyarul...nem tudtam hogy az mi, angolul már rögtön bevillant

    a java jobb. én delphi és vb6, vb.net után lendültem át php-ra aztán java-ra

    a java vb6 és .net szintű nyelvek után tényleg nehéz, teljesen más gondolkodásmód, de pár év után kenem vágom...
    Mutasd a teljes hozzászólást!
  • Ha a ket nyelv keverese osszezavar, akkor valoszinuleg egy nagyon gyenge programozo lennel, nem erdemes ezt a szakmat eroltetned.
    Mutasd a teljes hozzászólást!
  • Mindkét hozzászólónak köszönöm. Nem értem hosszútávon miért ne lehetne megélni programozásból. Még nem döntöttem el hogy programozni fogok-e egész életemben vagy mi mást, de elég jó megélhetési lehetőségeket látok a programozásban.
    Kedves utolsó hozzászóló, nem fejtenéd ki bővebben?
    Mutasd a teljes hozzászólást!
  • En Bruce Eckel - Thinking in Java 4. ed-et ajanlanam, ebbol tanultam egyetemista koromban. Java ismerete sokat segithet C# megerteseben, ha viszont osszezavarna, mint a masodik hozzaszolot, akkor ugyis tokmindegy, mert programozasbol nem fogsz megelni hosszu tavon...

    Ajanlanam figyelmedbe meg a Python/Ruby/PHP, Erlang/Haskell/LISP/Scheme, C++ nyelveket, remek agytagito gyakorlat lehet egy szamodra uj/mas szemleletu nyelv megismerese.

    Magyar szakkonyveket keruld, probalj minel tobb tevekenysegedben idegennyelvet gyakorolni!
    Mutasd a teljes hozzászólást!
  • Mutasd a teljes hozzászólást!
  • Az egyetemen előbb utóbb kénytelen leszek a JAVA-t megtanulni. Automatizáláson vagyok és állítólag az elkövetkező években amikor gépeket fogunk programozni az JAVA-ban lesz. Viszont hosszabb távon érdekel a C# is, de ha nem fér össze akkor lemondok róla és ha a JAVA majd letisztul már másképpen fogom nézni a dolgokat. Addig is ha valaki ajánlana egy JAVA programozós könyvet, annak örülnék.
    Mutasd a teljes hozzászólást!
  • Én csak annyit mondanék, mikor elkezdtem JAVA programozni -4 éves C# tapasztalattal a hátam mögött- belezavarodtam szintaktikailag, szemantikailag, mindenhogy. Javaslom, hogy ha komolyan akarsz valamelyikkel foglalkozni, egy életre szóló döntést kell hoznod, hogy C#-ban vagy Java-ban akarsz programozni. Hacsak nincs túl jó gondolkodási/vizuális képességed, hogy különbséget tegyél a két nyelv között. Egyetemen szívni fogsz ezzel...
    Mutasd a teljes hozzászólást!
  • Sziasztok!
    Elsőéves egyetemista vagyok, négy hónapja tanulok C-ben programozni. Ez úgy ahogy megy, de nem nagy a motivációm a vizsga után, tudva azt hogy a C egy viszonylag régi nyelv és hogy valószínűleg ha megtanulom a JAVA-t, a C++ -t vagy a C#-ot többet életemben nem fogom használni. Második félévben JAVA lesz az egyetemen, de fakultatív és a tanárok azzal biztatnak hogy lesz elég bajunk nélküle is. Én ettől eltekintve megtanulnám mert nagyon keresettek a JAVA programozók és hallottam, hogy nagyon sokoldalú programozási nyelv. Még lehetséges, hogy az egyetemen később hasznát venném.
    Első kérdésen az, hogy valami jó angol vagy magyar könyvet ismertek-e amiből érdemes tanulnom, így hogy most már tudom a programozás menetét, folyamatát?

    Hosszabb távú terveim között szerepel, hogy megtanulom a C#-ot, mert az is elég "menő" nyelv és windows phone alkalmazásokat akarok írni.
    A második kérdésem ehhez kapcsolódik. A JAVA alapjainak az elsajátítása előnyt jelentene-e a C#-hoz? (Mindkettő objektum orientált ebből gondolom.)

    Köszönöm az útbaigazítást előre is.
    Mutasd a teljes hozzászólást!
abcd