Java suorituskyvyn tuunaamisesta

Törmäsin erinomaiseen artikkelisarjaan koskien Java suorituskyvyn tuunaamista. Aihe on ollut lähellä sydäntäni, sitä on tullut koulutettua ja konsulttihommissakin olen asiakkaita auttanut tiristämään virtuaalikoneesta kaikki tehot irti ja miettimään mitä hölmöilyjä EI SAA koodissa tehdä. Kuitenkin tuntuu että joka kuukausi aiheesta oppii lisää, ja aina välineet voisivat olla myös parempia mitä käyttelee.

 

Kirjoittelin jo taannoin New Relic tuotteesta joka osui omaan tutkaan JavaOne seminarissa vuonna 2011. Samaan sarjaan kuuluvat JRebel, JFrog ja Artifactory, hyviä vimpaimia kaikki. Näistä New Relic perustuu reaaliaikaiseen suorituskyvyn mittaukseen, monitorointiin ja analysointiin, ja vaikuttaisi rahan arvoiselta palikalta. Itselle ei ole ollut tarpeen kuitenkaan sitä ostella, koska omissa systeemeissä ei ole ihmeempiä suorituskykyhaasteita koskaan ollut, ja vähäiset mysteerit on pystytty ratkomaan ihan jconsolella tai visualvm:llä sekä logeilla.

 

Pari omaa kulmakiveä mitä tulee Java suorituskykyyn:

– Koodin optimoinnilla on lopulta varsin vähäinen merkitys, se mikä merkitsee on arkkitehtuuri ja se että koodissa ei hölmöillä eli turhaan haaskata suorituskykyä.

– Java on pääsääntöisesti nykyään C++ kielen kanssa tasalinjalla monessa operaatiossa, mutta on yhä alueita joissa se voi olla tolkuttoman hidasta. Pääsääntö siihen miten olla hölmöilemättä on ymmärtää Java muistimalli. Kiitos automaattisen roskankeruun tärkeintä on olla aiheuttamatta tarpeetonta roskankeruuta. Etenkään jos roskankeruualgoritmi on ns. Stop-The-World malli joka paussittaa oman koodin. Joissain mittaroimissani koodipohjissa vietetään aikaa roskankeruussa enemmän kuin itse tuotantokoodissa – pahimmillaan suhde on ollut jopa 99% vs 1%! Roskankeruuta voi välttää pääsääntöisesti miettimällä olioiden elinkaarta ja raskautta, ja tekemällä niistä tarvittaessa pitkäikäisempiä.

– Parhaiten optimoituu koodi joka on kirjoitettu hyvin yksinkertaisesti. Java virtuaalikone optimoi ajon aikana ja optimointi perustuu siihen miten koodi normaalisti toimii. Jos olet koodannut kummallisia virityksiä, virtuaalikone ei ehkä kykene koodia optimoimaan oikein tai voi jopa optimoida väärin. Muista siis optimoinnin kolme ensimmäistä sääntöä: Älä optimoi koodatessasi, älä optimoi koodatessasi, ÄLÄ OPTIMOI KOODATESSASI! Tee koodia joka on selkeää ja ymmärrettävää ensin, ja optimoi vasta tarpeen tullen ja mittaustuloksiin perustuen.

– Virtuaalikonetta voi tuunata. Sitä ei kuitenkaan kannata tehdä sokkona vaan taas pitäisi tietää mitä muistin sisällä tapahtuu. Turn on the headlights! Virtuaalikoneessakin on kosolti kytkimiä joilla sieltä saa tietoa muistista, optimoinneista ja ajankäytöstä. Löytyy myös visuaalisia työkaluja jotka ovat hyviä tiivistämään näkymiä suuresta datamassasta. Java ei nopeudu välttämättä lisäämällä isompi muistikampa ja parempi prosessori – se voi pahimmillaan jopa hidastua siitä (kiitos roskankeruun toiminnan).

Tuossapa taas viikon ärhentelyt. Java optimointi ei ole vaikeaa, mutta se vaatii osaamista, tietoa, työkaluja, ja hieman loogista päättelyä. Se vaatii myös testi edellä menemistä, koska joskus arvaus tai teoria osoittautuu vääräksi ja voi jopa hidastaa tai muuttaa sovellusta raskaammaksi tarpeettomasti.

Joka tapauksessa, tässä muiden ajatuksia aiheista ja välineistä. JRebelillä on tietysti oma lehmä ojassa mutta mielenkiintoista luettavaa silti. Meillä asiaa puidaan mm. Tehokas Java-kurssilla:

Tehokas Java-kurssi Tieturilla

Become a Java GC Expert artikkelisarja

 

 

Mainokset

Ohjelmointikielten suosituimmuudesta

Aika ajoin aina tulee vastaan kysymyksiä siitä mikä kieli on nyt kova, onko joku laskussa? Onko jotain uutta tulossa? Mitä pitäisi opiskella ollakseen kilpailukykyinen työmarkkinoilla?

Vaikeahan näihin on vastata, riippuu pitkälti näkökulmasta. Aiemmin olen seuraillut Tiobe indeksiä, mutta siinäkin systeemissä laskutapa herättää vähän mietintää.. Siinä käytetään referenssinä hakukoneiden tietoja, eli se listaa kieliä sen mukaan mitä hakukoneet löytävät. Organisaatioiden sisäisistä hankkeistahan ei paljoa välttämättä ulospäin näy. Mutta on se silti suuntaa antavaa. Tioben kärjessä on kimallellut Java pitkään, tosin hiukan aikaa sitten C kieli pomppasi yllättäen sen ohi. Ja kyse ei siis ole ObjectiveC suosiosta, se näkyy omana trendinään matalalla. Mutta Javan osuus on 18% paikkeilla, joka jättää toki runsaasti tilaa muille. Tätä kirjoittaessa Tioben viisi kovinta ovat:

  •  Java (18.4%)
  •  C (17.1%)
  •  Objective C (reipas nousu, 9.8%)
  •  C++ (8.8%)
  •  C# (6.7%)

Näitä seuraa PHP, Python, ja Visual Basic, jonka jälkeen aletaan puhumaan jo alle kahden prosentin osuuksista. Yllättävästi esim. Ruby, JavaScript, menevät tänne kategoriaan, saaden seuraa kielistä kuten Lisp, Pascal, Assembler 😉 Josta syystä kyseenalaistankin vähän tuloksia. Olisiko kuitenkin niin että esim. AJAX:ia ja JavaScriptiä käytellään paljon enemmän nykyään, mutta sitä ei pidetä koodaamisena koska se on yleensä jonkun muun projektin sivutuote ja saattaa perustua valmiskirjastojen käyttöön?

Joka tapauksessa, aamulla lukiessani uutisia törmäsin toiseenkin aika kiintoisaan indeksiin. Kyseessä on RedMonk indeksi, jossa laitetaan ohjelmointikielet järjestykseen matriisiin kahden kriteerin perusteella: miten usein kielen nimi esiintyy StackOverFlow keskusteluissa, ja miten moni GitHub projekti käyttää ko kieltä. RedMonk top kielet näin verraten ovat:

  • JavaScript
  • Java
  • PHP
  • Python
  • Ruby
  • C#
  • C++
  • C
  • Objective-C
  • Shell

Eli nämä kaksi eri laskutapaa näyttävät olevan osittain ristiriidassa. Java löytyy kunkkuna molemmista, mutta juurikin JavaScript, Ruby tuovat suorastaan päinvastaiset näkemykset. Itselleni tämä lista vaikuttaa uskottavammalta. Tässä myös kiinnostavaa että omat seurannan alla olevat lempikielet Scala ja Groovy ovat kovassa nosteessa, ja kirivät jo kiinni kärkipään kieliä. Tosin niiden kanssa samoissa lukemissa on myös Assembler, Matlab, ja vastaavat 😉

language-ranking-0912

Joka tapauksessa, yhdistellen noita molempia listoja niin tuskin menevät investoinnit hukkaan jos panostaa osaamiseen sektoreilla Java, C#, C, C++, ObjectiveC. Kiistanalaisempia mutta kiinnostavia ovat PHP, Python, JavaScript, Ruby. Tietysti on myös hyvä seurata rakettimaisessa nousussa olevia kieliä, molemmat indeksit listaavat omat nousijansa. Tioben kovia nousijoita ovat ObjectiveC, Java (joku tilapäinen pomppu), Python. RedMonk listailee mm. nousijoiksi CoffeeScript, Visual Basic, ASP, Assembly, C++, Haskell, Scala.

Mielenkiintoista myös se näkyvätkö/miten näkyvät mobiiliteknologiat näissä. ObjectiveC viittaa selvästi iLaitteiden suuntaan, kun taas Android osunee Java massan alle. Omaan tutkaan on osunut yhä enemmän mobiiliprojekteja koto-Suomessakin.

Eli onko uutta Javantappaja-kieltä joka muuttaisi Javan uudeksi Coboliksi? Eipä näy vielä tutkassa. Ehkä sellaista ei tulekaan. Ehkä me elämme Polyglot aikaa, ja on vain oltava useita kieliä työkalupakissa. Toisaalta suosituimmat kielet listalla ovat jo aika vanhoja, niiden on aika elää ajan mukana ja muuttua, tai jähmettyä kiveksi ja jäädä jalkoihin. Onnistuuko tuleva Java 8 tässä? Entäpä HTML5+JavaScript?

 

 

Tuossapa linkkejä tuloksiin ja meidän kursseihimme alueilta (ObjectiveC ja iphone ohjelmointi tulossa pian):

http://redmonk.com/sogrady/2012/09/12/language-rankings-9-12/

http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html

http://www.tieturi.fi/kurssit/koulutus.html?category=Open+Source+Java

http://www.tieturi.fi/kurssit/koulutus.html?category=Web

http://www.tieturi.fi/kurssit/koulutus.html?category=Microsoft-teknologiat

http://www.tieturi.fi/kurssit/koulutus.html?category=Muut+ohjelmointiteknologiat

 

Ouya pelikonsoli Android alustalle

Ei välttämättä mikään uutinen mutta Ouya pelikonsoli tulee valmiiksi ja kuluttajatoimitukseen maaliskuussa. Kyseessä on Kickstarter-rahoitettu Android 4.1 pohjainen pelikonsoli, jonka hinta on tuossa sadan taalan paikkeilla. Laite kiinnostaa kovasti juuri tuon Android puolen vuoksi, koodattauus voi tuoda sille paljon pelejä, tai sitten ei. Veikkaan että tuo. Vielä kun itsellä riittäisi aikaa kokeilla. Toisaalta peliohjelmointi ei ole koskaan ollut vahva puoleni vaikka sitäkin on tullut harrasteltua ja opiskeltua.

Ouya

Sen verran vimpain kuitenkin kiinnostaa että pistin aikanaan yhden heti tilaukseen. Näemmä sitä saa Android-Javan ohella koodailla myös C#, JavaScript, ja Boo-kielellä. Kai sinne jotain kevyttä pitäisi vääntää ihan vain piruuttaan. Ja siinä on Tegra3 siru 😉

Mitä kaikkea koodattavaa sitä tulee tänä vuonna.. Android kamera, Android pelikonsoli, Android tabletit ja puhelimet, Android silmälasit.. :p

 

Lähteitä:

http://jaxenter.com/android-based-ouya-console-nears-release-46096.html

http://www.eurogamer.net/articles/df-hardware-how-powerful-is-tegra-3