kun katsoo jotain keskusteluja, niin siellä vain sanotaan että java on käsittämättömän hidas yms. onko java oikeasti liian hidas esim pelien tekemiseen?
Ei ole. Nettihän on pullollaan Java-pelejä. On se kuitenkin usein hitaampi kuin C++, mutta yleensä kaikista hitain on kuitenkin se ohjelmoijan koodi. Hidas koodi on hidasta joka kielellä, ja nopea koodi on hitaallakin kielellä yleensä nopeampaa kuin hidas koodi nopealla kielellä.
ok, kiitos vastauksesta, etten heti vaihda c:hen kun häiritsi tuo javan haukkuminen..
Jos ohjelma minkä olet tehnyt tai mitä olet tekemässä ei ole liian hidas, niin ei se ohjelmointikielikään siinä tapauksessa voi olla liian hidas. Jos taas ohjelma on liian hidas, niin lähes aina vika on koodissa (käytetyissä algoritmeissa) eikä käytetyssä kielessä.
Lisäksi kannattaa miettiä myös käyttötarkoitusta ja kuluvaa koodausaikaa eikä vain koodin nopeutta: esimerkiksi jos ohjelma suoritetaan kerran päivässä ja sen suorittaminen kielellä x kestää 30 sekuntia ja optimoituna tai muutettuna kielelle y se kestäisi vain 1 sekunnin, mutta muutoksiin menisi 20 työtuntia, niin onko muutos sen arvoinen, jos tuloksen saannilla ei ole niin kovin kiire?
Totuushan on kuitenkin se että java ON hitaanpi, koska sitä tulkataan suorituksen aikana. Mutta onko taas sitteen muutaman sekunnin viive ohjelmassa niin merkittävää, kun ottaa huomioon kuitenkin javan hyvät puolet (alustariippumaton, kattava kirjasto)?
Ei Javaa edes tulkata suorituksen aikana kuin vain vähän aikaa - JIT kääntäjä pyöräyttää sen nopeasti natiivikoodiksi. Jos haluat kokeilla, kuinka hidas Java on vain tulkattuna (kuten ennen vuonna 1998 julkaistua Java 1.2:ta), niin anna jollekin Java-ohjelmalle komentoriviparametrinä -Xint niin JVM ainoastaan tulkitsee koodia. Ero on selvästi havaittavissa (esim. ota aikaa, että kauanko jonkin komentoriviohjelman suorittaminen kestää).
EDIT1:
public class Test { public static void main(String[] args) { long start = System.currentTimeMillis(); for (int i = 0; i < 1000 * 1000 * 1000; i++) { } long end = System.currentTimeMillis(); System.out.println((end - start) + " ms"); } }
Yllä olevan esimerkkikoodin (kasvatetaan kokonaislukua miljardi kertaa) suoritusaika on koneellani (C2Q6600 @ 3.0 GHz) seuraavilla komentoriviparametreillä:
Parametrit Suoritusaika -Xint 9781 ms (koodia vain tulkitaan, JIT ei käytössä) -client 454 ms (oletuksena Java käyttää tätä Client VM:ää) -server 0 ms (ilmeisesti Server VM optimoi tuon luupin pois)
EDIT2:
Tässä hieman parempi microbenchmark, jota Server VM ei osaa optimoida pois. Otetaan aikaa, että kauanko kestää laskea Fibonaccin lukujonon 42. numero (erittäin naiivilla algoritmilla).
public class Test { public static void main(String[] args) { long start = System.currentTimeMillis(); int x = fib(42); long end = System.currentTimeMillis(); System.out.println((end - start) + " ms"); System.out.println(x); } private static int fib(int n) { if (n > 1) { return fib(n - 1) + fib(n - 2); } else { return n; } } }
Suoritin testin Java 1.6.0_11:llä kolme kertaa eri JVM-parametreillä. Koodin suorittaminen tulkittuna on noin kymmenen kertaa hitaampaa kuin Java normaalisti.
-server 2297 ms 2296 ms 2297 ms -client 2578 ms 2563 ms 2578 ms -Xint 25500 ms 25500 ms 25500 ms
Ei kannata olla huolisssaan noista nopeuseroista kun taidat Tommittaja vielä ohjelmointiurasi alussa vielä olla. Opettele ensin ohjelmoinnin perusjuttuja. Sitten, jos sille nopeuskriittiselle ohjelmoinnille tulee oikeasti tarvetta, niin voit helposti opetella sen nopeamman kielen. Javalla pärjää melko pitkälle. Pelejäkin sillä saa aikaiseksi.
Tuntuu, että Javaa moni (mahdollisesti ilman parempaa tietoa) sanoo hitaaksi, koska niin on tapana sanoa. C:llä taas on nopean kielen maine. Toki C:llä saat ohjelmia nopeammaksi kuin Javalla, mutta ei se tosiaan automaattisesti tapahdu, kuten on jo keskustelussa todettu. Käytetyt algoritmit ja tietorakenteet näyttelevät suurta osaa tässä.
Tommittaja kirjoitti:
ok, kiitos vastauksesta, etten heti vaihda c:hen kun häiritsi tuo javan haukkuminen..
Ei kannata olla heti kieltä vaihtamassa, jos joku sanoo jotain pahaa käyttämästäsi kielestä. Jokaisella kielellä on ne huonot puolensa. Voitaisiin tuota C:täkin vielä haukkua (mistä tosin ei juurikaan hyötyä taida olla), jotta valintasi tuntuisi paremmalta.
PS. Miten jotain kieltä voi sanoa hitaaksi? Onko jossain määritelty milloin ohjelmointikieli on hidas?
PSS. Niin ja assemblyllähän saa mahdollisesti vielä nopeampia ohjelmia kuin C:llä.
toi mun "etten heti vaihda c:hen" oli vaan tollanen sarkastinen heitto, mutta kyllä, olen ohjelmointiurani alussa ja eniten muistia vievä ohjelmani oli varmaankin numeronarvauspeli parseintillä :D
Java on mielestäni erinomainen valinta aloittelevan ohjelmoijan kieleksi. Todella monipuolinenkin, hyvät kehitysalustat, laajasti tuettu. Lisäksi toimii lähes kaikilla alustoilla, ja vieläpä on versiot mobiilisoftille (Java ME), webbisovelluksille (Java EE) ja Androidikihan sitä rynnii markkinoille Javan voimin. Joten Javan osaamisella voikin tehdä kaikenlaista.
Toki onhan sillä heikkouksiakin, mutta milläpä kielellä ei olisi.
Saapa nähdä koska OP:hen tulee oma alue Javalle, melkeinpä kaikki "Muut kielet" keskustelualueen viesteistä näyttävät koskevan Javaa.
JTS kirjoitti:
melkeinpä kaikki "Muut kielet" keskustelualueen viesteistä näyttävät koskevan Javaa.
niin kai nyt, koska suurin osa on minun viestejäni.. :D
Edit: hups, onhan siellä näköjään muidenikin java viestejä, kun menee ekalta sivulta poies..
Todellakin, riippuu koodista ennemmin. Esimerkkinä RuneScape. Alussa peli pyöri hyvin (tarpeeksi hyvin) kun pelikin oli vielä pieni. RS2:sen tultua ja Classicin kuoltua peli kasvoi niin suureksi että se todellakin kävi hitaaksi (grafiikan piirto takkuili) joten sitä alettiin väsäämään tarkemmin. Pelistä tuli jo 5 kertaa suurempi kuin Classic mutta suorituskyky palautui ja jopa nousi moninkertaiseksi. Nyt peli on jättimäinen ja pyörii puhtaasti OpenGL:llä kun aiemmin se pyöri kömpelöllä Javan Software-modella.
Ei pidä unohtaa vielä toista esimerkkiä: veli sanoi että alkuperäisen MoparScapen client.java oli yli 5Mt (muistan sen hyvin) kun sisälsi kaiken mitä pelaaja saattoi tehdä ja peli lagasi niin servulla kuin clientilla. Kun vihdoin koodi jaettiin muutamaan kymmeneen tiedostoon, kaikki lagi lähti eikä tullut takaisin.
Mitä tulee vielä "Java vai C ?", Antti Laaksonen jossain (VB-)tredissä(ni) sanoi että C-kieli on erittäin vanha kieli ja VB nykyaikainen ja ohimennen mainitsi Javan potkivan C:eetä ympäri maapalloa nou trouble.
rautamiekka kirjoitti:
Mitä tulee vielä "Java vai C ?", Antti Laaksonen jossain (VB-)tredissä(ni) sanoi että C-kieli on erittäin vanha kieli ja VB nykyaikainen ja ohimennen mainitsi Javan potkivan C:eetä ympäri maapalloa nou trouble.
Toisaalta nykyään käytetään myös C++:aa.
Vertaus on aika huono, koska Javan pahin vihollinen ei ole C, vaan käsittääkseni Microsoftin .NET-järjestelmä. C-kielelle on edelleen hyvin paljon käyttöä sellaisissa paikoissa, joihin esimerkiksi Java ei oikein taivu, kuten sulautettujen järjestelmien ohjelmointi.
rautamiekka kirjoitti:
Antti Laaksonen - - ohimennen mainitsi Javan potkivan C:eetä ympäri maapalloa nou trouble.
En ole koskaan väittänyt tällaista.
jokainen kieli soveltuu eri tavalla eri tarkoituksiin. mutta mainittakoon, että javalla et voi ohjelmoida vaikkapa uutta käyttistä, c/c++ pystyy
JAMSUO93 kirjoitti:
jokainen kieli soveltuu eri tavalla eri tarkoituksiin. mutta mainittakoon, että javalla et voi ohjelmoida vaikkapa uutta käyttistä, c/c++ pystyy
Ja C++:lla et voi ohjelmoida selainsovelmia tai kännypelejä(tai emt, mut yleensä ne on kyllä Javaa).
Noni ollaan tasoissa, ei haukuta Javaa ;D
Matso kirjoitti:
JAMSUO93 kirjoitti:
jokainen kieli soveltuu eri tavalla eri tarkoituksiin. mutta mainittakoon, että javalla et voi ohjelmoida vaikkapa uutta käyttistä, c/c++ pystyy
Ja C++:lla et voi ohjelmoida selainsovelmia tai kännypelejä(tai emt, mut yleensä ne on kyllä Javaa).
Noni ollaan tasoissa, ei haukuta Javaa ;D
Varsinkin uudemmissa mobiililaitteissa ne softat on kyllä suht pitkälti C++:aa, toki Javaakin näkee.
C++:n avulla voi tehdä tasan kaiken mitä Javalla ja enemmän.
Toisaalta tiiliskivillä ja laastilla rakennat vaikka minkämuotoisen talon, mutta siinä vaiheessa kun olet rakentanut ensimmäisen tyylikkään omakotitalosi on naapuri rekalla, elementtipaloilla ja nostokurjella rakentanut kokonaisen kaupungin.
Opettele ohjelmoimaan sillä kielellä mikä kivalta tuntuu. Suorituskyky yms. tulevat sitten ajallaan. Java on hyvä kieli lähteä liikkeelle, aivan kuten python, c, php, basic...
Mielipiteitä puolesta ja vastaan tulee, valitsit minkä kielen tahansa.
Tzaeru kirjoitti:
C++:n avulla voi tehdä tasan kaiken mitä Javalla ja enemmän
Jooh.. mut jos puhuttais vaikka siitä, mitä milläkin käytännössä voi tehdä, joka on aivan eri asia kuin mihin se teoriassa pystyy.
Esimerkiks webbiselaimiin ei ole sellaista lisäosaa, että voisit tehdä C++:lla sen päällä toimivia sovelmia. (Javassa applet). Voit toki koodata ensin Firefoxiin tällaisen lisäosan ja sitten tehdä sen sovelmas, mutta se ei ole realistista eikä toimivaa, koska sillä ei saa mitään todellista hyötyä = käyttäjiä.
Teoriassa voidaan mennä aina vaan kauemmas ja epärealistisempiin menetelmiin, mutta niillä kun ei ole käytönnön kanssa mitään tekemistä.
Matso kirjoitti:
Esimerkiks webbiselaimiin ei ole sellaista lisäosaa, että voisit tehdä C++:lla sen päällä toimivia sovelmia.
Eipäs unohdeta Googlen native client -härpäkettä (jolla ainakin teoriassa voisi jos sen saisi toimimaan)!
Matso kirjoitti:
Esimerkiks webbiselaimiin ei ole sellaista lisäosaa, että voisit tehdä C++:lla sen päällä toimivia sovelmia. (Javassa applet). Voit toki koodata ensin Firefoxiin tällaisen lisäosan ja sitten tehdä sen sovelmas, mutta se ei ole realistista eikä toimivaa, koska sillä ei saa mitään todellista hyötyä = käyttäjiä.
Onko Adobe Flash tuttu nimi?
Ei ole vielä tullut vastaan Java tai flash peliä jossa on käytössä sulava 3D grafiikka sekä yhtä nopea näppäimistön/hiiren käyttö (input lag) kun perinteisillä ohjelmointikielillä. Latausajat?
JAMSUO93 kirjoitti:
jokainen kieli soveltuu eri tavalla eri tarkoituksiin. mutta mainittakoon, että javalla et voi ohjelmoida vaikkapa uutta käyttistä, c/c++ pystyy
http://en.wikipedia.org/wiki/JavaOS
http://www.jnode.org/
...
User137 kirjoitti:
Ei ole vielä tullut vastaan Java tai flash peliä jossa on käytössä sulava 3D grafiikka sekä yhtä nopea näppäimistön/hiiren käyttö (input lag) kun perinteisillä ohjelmointikielillä. Latausajat?
User137 kirjoitti:
Ei ole vielä tullut vastaan Java tai flash peliä jossa on käytössä sulava 3D grafiikka sekä yhtä nopea näppäimistön/hiiren käyttö (input lag) kun perinteisillä ohjelmointikielillä. Latausajat?
Mielenkiinnolla odotamme Quake Liveä :)
Jackal von ÖRF kirjoitti:
Voi hyvä luoja! Tuo toimii paremmin kun alkuperänen O.o Maksimi resoluutio, äänet jne ilman pienintäkään lagia missään. Njoo kai sillä Javalla sitten sais ihan ammattitason pelejäkin. Muistelin kokeilleeni tuota joskus mutta en ihan tätä odottanut.
Aihe on jo aika vanha, joten et voi enää vastata siihen.