Testiraportti Android virtuaalikone vs. natiivikoodi Ville Laine, Delta 23



Samankaltaiset tiedostot
Videotoisto Nexus 7 tableteilla: Android 4.4 KitKat selvästi edellistä versiota heikompi

5. Numeerisesta derivoinnista

Tutoriaaliläsnäoloista

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo

Android ohjelmointi. Mobiiliohjelmointi 2-3T5245

7. Näytölle tulostaminen 7.1

Fysiikan laboratoriotyöt 1, työ nro: 2, Harmoninen värähtelijä

Algoritmit 1. Luento 3 Ti Timo Männikkö

Javan perusteita. Janne Käki

Matematiikan tukikurssi

Tekninen suunnitelma - StatbeatMOBILE

ELM GROUP 04. Teemu Laakso Henrik Talarmo

Tekninen suunnitelma - StatbeatMOBILE

2) Aliohjelma, jonka toiminta perustuu sivuvaikutuksiin: aliohjelma muuttaa parametrejaan tai globaaleja muuttujia, tulostaa jotakin jne.

Luento 1 Tietokonejärjestelmän rakenne

Luento 1 Tietokonejärjestelmän rakenne. Järjestelmän eri tasot Laitteiston nopeus

Kehittyneiden Aaltomuotojen Käytettävyys HF-alueen Tiedonsiirrossa

4. Luokan testaus ja käyttö olion kautta 4.1

11/20: Konepelti auki

CUDA. Moniydinohjelmointi Mikko Honkonen

Järvitesti Ympäristöteknologia T571SA

MATEMATIIKAN KOE. AMMATIKKA top asteen ammatillisen koulutuksen kaikkien alojen yhteinen matematiikka kilpailu. Oppilaitos:.

Osoitin ja viittaus C++:ssa

Pedacode Pikaopas. Java-kehitysympäristön pystyttäminen

Matematiikan tukikurssi

Luento 1 Tietokonejärjestelmän rakenne

Luento 1 Tietokonejärjestelmän rakenne. Järjestelmän eri tasot Laitteiston nopeus

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

Juuri 10 Tehtävien ratkaisut Kustannusosakeyhtiö Otava päivitetty

3. Muuttujat ja operaatiot 3.1

Talousmatematiikan perusteet: Luento 4. Potenssifunktio Eksponenttifunktio Logaritmifunktio

Tuotantoprosessin optimaalinen aikataulutus (valmiin työn esittely)

Mobiilipalvelut kirjastoissa Juha Hälinen verkkopalvelusuunnittelija

Jos nyt on saatu havaintoarvot Ü ½ Ü Ò niin suurimman uskottavuuden

Testidatan generointi

LIITE 1 VIRHEEN ARVIOINNISTA

(b) Tunnista a-kohdassa saadusta riippuvuudesta virtausmekaniikassa yleisesti käytössä olevat dimensiottomat parametrit.

Solidity älysopimus ohjelmointi. Sopimus suuntautunut ohjelmointi

Harjoitustyö: virtuaalikone

LIITE 1 VIRHEEN ARVIOINNISTA

Rajapinta (interface)

¼ ¼ joten tulokset ovat muuttuneet ja nimenomaan huontontuneet eivätkä tulleet paremmiksi.

Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä

Sisällys. 3. Muuttujat ja operaatiot. Muuttujat ja operaatiot. Muuttujat. Operaatiot. Imperatiivinen laskenta. Muuttujat. Esimerkkejä: Operaattorit.

Differentiaalilaskennan tehtäviä

Luento 1 (verkkoluento 1) Tietokonejärjestelmä

Lyhyt yhteenvetokertaus nodaalimallista SÄTEILYTURVAKESKUS STRÅLSÄKERHETSCENTRALEN RADIATION AND NUCLEAR SAFETY AUTHORITY

Havaitsevan tähtitieteen peruskurssi I

Integrointi ja sovellukset

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Taulukot. Jukka Harju, Jukka Juslin

Qt kaikkialla?

58160 Ohjelmoinnin harjoitustyö

Mobiilijäsenkortti. Mobiilikortin aktivointi

815338A Ohjelmointikielten periaatteet

Tietorakenteet ja algoritmit

Kehitysohje. ETL-työkalu. ExtraTerrestriaLs / Aureolis Oy

Diplomi-insinööri- ja arkkitehtikoulutuksen yhteisvalinta 2017 Insinöörivalinnan matematiikan koe , Ratkaisut (Sarja A)

Matematiikan tukikurssi

AS C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2

8. Näppäimistöltä lukeminen 8.1

5.3 Ensimmäisen asteen polynomifunktio

jakokulmassa x 4 x 8 x 3x

TIE Tietorakenteet ja algoritmit 1. TIE Tietorakenteet ja algoritmit

BEYOND: Two Souls BEYOND Touch Sovellus

Integrointi. Ohjelmistotekniikka kevät 2003

Sisältö. 22. Taulukot. Yleistä. Yleistä

Differentiaali- ja integraalilaskenta

Sisältö. 2. Taulukot. Yleistä. Yleistä

Matematiikan tukikurssi

Luento 1 (verkkoluento 1) Ohjelman sijainti Ohjelman esitysmuoto Laitteiston nopeus

Sulautettujen järjestelmien skaala on niin laaja, että on erittäin vaikea antaa yleispätevää kuvausta siitä millainen on sulautettu järjestelmä.

Vaatimusmäärittely Ohjelma-ajanvälitys komponentti

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

LIITE 1 VIRHEEN ARVIOINNISTA

Luento 7. T Ohjelmoinnin jatkokurssi T1 & T Ohjelmoinnin jatkokurssi L1. Luennoitsija: Otto Seppälä

y + 4y = 0 (1) λ = 0

Kontrollipolkujen määrä

Matemaattinen Analyysi

6*. MURTOFUNKTION INTEGROINTI

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen

Hyvä mobiilikortin käyttäjä!

KJR-C1001 Statiikka ja dynamiikka. Luento Susanna Hurme

Sisällys. 11. Javan toistorakenteet. Laskurimuuttujat. Yleistä

Nopeus, kiihtyvyys ja liikemäärä Vektorit

Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python

Rinnakkaistietokoneet luento S

7. Oliot ja viitteet 7.1

Amazon Web Services (AWS) on varmaankin maailman suosituin IaaS-tarjoaja. Lisäksi se tarjoaa erilaisia PaaS-kategoriaan kuuluvia palveluita.

PRELIMINÄÄRIKOE PITKÄ MATEMATIIKKA

Talousmatematiikan perusteet

Juuri 12 Tehtävien ratkaisut Kustannusosakeyhtiö Otava päivitetty

Osio 2: Luennot 5-8 Muistinhallinta

Ohjelmistojen testaus ja hallinta. Gradle

Ohjelmointikielet ja -paradigmat 5op. Markus Norrena

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Transkriptio:

Testiraportti Android virtuaalikone vs. natiivikoodi Ville Laine, Delta 23 1

Sisällys 1. Johdanto...3 2. Testiohjelma...3 2.1. Testi 1: Raaka funktiokutsu...3 2.2. Testi 2: Yhteenlaskutesti...3 2.3. Testi 3: Kertolaskutesti...3 2.4. Testi 4: Jakolaskutesti...4 2.5. Testi 5: Todellisen maailman matematiikka...4 2.6. Testi 6: Muistinvaraus...4 2.7. Testi 7: Luokkatesti...4 3. Tulokset...4 4. Huomioitavaa tuloksista...6 4.1. Testi 1...6 4.2. Testi 6...6 4.3. Testi 7...6 5. Lopputulokset...7 6. Lähteet...8 2

1. Johdanto Android käyttöjärjestelmä suorittaa sovellukset ensisijaisesti käyttäen Dalvik virtuaalikonetta (Bornstein). Koska Dalvik on Javapohjainen, ja Javan suorituskyvystä voidaan olla montaa mieltä, herää väistämättä kysymys: valuvatko nykyisten mobiililaitteiden tehot hukkaan jos niitä käytetään virtuaalikoneen läpi. Omakohtaiset epäilykseni Dalvik -koneen suorituskyvystä heräsivät viimeistään siinä vaiheessa, kun ohjelman nopeus oli katastrofaalisen hidas vielä senkin jälkeen kun kaikki hyvän olio-ohjelmoinnin periaatteet oli hylätty paremman suorituskyvyn toivossa. Tämän seurauksena ainoa vaihtoehto on virtuaalikoneen hylkääminen ja ohjelman tekeminen suoraan natiivikoodilla (C/C++). Android tarjoaa työkalut myös natiiviohjelmien tekemiseen, mutta nämä työkalut ei kuulu perus SDK:iin vaan käyttäjän täytyy ladata Native Develpoment Kit (NDK). 2. Testiohjelma Jotta voitiin selvittää tarkalleen missä ohjelman nopeuden pullonkaula on, luotiin yksinkertainen testiohjelma, joka mittaa eri toimintoihin kuluvan ajan kun ne suoritetaan virtuaalikoneella ja natiiviohjelmalla. Testiohjelma mittaa ajat millisekunteina sekä Javan nanotime metodilla. Nanotimen antamaa tulosta ei kuitenkaan voida muuttaa mihinkään järkevään aikayksikköön johtuen sen riippuvuudesta prosessorin kellotaajuudesta, joten testituloksissa ei ole yksikköä. Tällä ei ole merkitystä testin kannalta, sillä ainoastaan aikaero on oleellinen. Kuten jo mainittu, suoritusajat mitattiin javaohjelmalla, joten natiivin ohjelman suoritukseen kuluu aina jonkin verran ylimääräistä aikaa. Tämä voidaan tarvittaessa kompensoida käyttämällä testin 1 tuloksia, mutta erot eivät kuitenkaan ole niin merkittäviä, että tässä tutkimuksessa kompensointia olisi tehty. Testiohjelma koostuu 7 eri testistä joiden toiminta on kuvattu alla. Kukin testi toistettiin 100 kertaa poikkeuksena muistinvaraus- ja luokkatestit, jotka ovat niin raskaita, että niiden toistamiseen olisi kulunut liikaa aikaa. Nämä testit toistettiin vain 10 kertaa. Tuloksissa on esitetty kaikkiin toistoihin kulunut yhteisaika. Testien kuvauksissa n on 100000. 2.1. Testi 1: Raaka funktiokutsu Raaka funktiokutsutesti mittaa ajan joka kuluu funktion kutsumiseen, ja tuloksen palauttamiseen. Funktiossa ei tehdä mitään. 2.2. Testi 2: Yhteenlaskutesti Yhteenlaskutestin ensimmäisessä osassa lasketaan kahden vakion summa n kertaa. Toisessa osassa tulos lisätään itseensä n kertaa. 2.3. Testi 3: Kertolaskutesti Kertolaskutestin ensimmäisessä osassa lasketaan liukuluvun tulo itsensä kanssa n kertaa. Toisessa osassa tulos lisätään itseensä n kertaa. 3

2.4. Testi 4: Jakolaskutesti Jakolaskutestissä lasketaan ensin kahden vakion osamäärä n kertaa ja seuraavaksi jaetaan tulosta vakiolla n kertaa. 2.5. Testi 5: Todellisen maailman matematiikka Tässä testissä käytetään kunkin ympäristön tarjoamia matematiikkakirjastoja. Javalla käytettiin Androidille optimoitua FloatMath luokkaa ja C++:lla standardikirjaston math kirjastoa. Testin ensimmäisessä osassa laskettiin monimutkainen trigonometrinen lauseke n kertaa ja toisessa osassa kolmekomponenttisen vektorin pituus n kertaa. Lausekkeet olivat: cos(n) sin( 1.52 n+1 ) (n 3.0) (n 3.0)+( n 1.87 ) ( n 1.87 )+n n 2.6. Testi 6: Muistinvaraus Muistinvaraustestissä varattiin b tavua muistia, kirjoitettiin se täyteen, ja sen jälkeen luettiin kaikki tavut. b:n arvo riippuu testilaitteen muistikapasiteetista. 2.7. Testi 7: Luokkatesti Luokkatestissä kutsutaan n:n luokkainstanssin metodia joka lisää kentän 1 arvoa annetulla parametrilla. Parametrin arvo haetaan saman instanssin toisella metodilla, joka palauttaa kentän 2 arvon. 3. Tulokset Testiohjelma suoritettiin kahdella testilaitteella; Samsung Galaxy S ja Denver Tac-7025. Tulokset on esitetty taulukoissa 1 4. 4

Taulukko 1 SGS tulokset millisekunteina VM Native code Difference Raw function call 1 0 1 Addition 343 0 343 Multiplication 817 0 817 Division 1523 8 1515 Real world math 1460 0 1460 Memory allocation 12644 2971 9673 Class 318 59 259 17106 3038 14068 Taulukko 2 SGS nanotime tulokset VM Native code Difference Raw function call 350457 266001 84456 Addition 350622800 414337 350208463 Multiplication 817424920 372540 817052380 Division 1520945887 8173705 1512772182 Real world math 1455797477 381922 1455415555 Memory allocation 12642756638 2968950055 9673806583 Class 316769999 59859915 256910084 17104668178 3038418475 14066249703 Taulukko 3 Tac-7028 tulokset millisekunteina VM Native code Difference Raw function call 0 16-16 Addition 593 2 591 Multiplication 1643 0 1643 Division 2990 2 2988 Real world math 2943 2 2941 Memory allocation 50678 15542 35136 Class 798 235 563 59645 15799 43846 Taulukko 4 Tac-7028 nanotime tulokset VM Native code Difference Raw function call 1291257 15956308-14665051 Addition 591049523 827171 590222352 Multiplication 1635895476 922559 1634972917 Division 2990148253 2402756 2987745497 Real world math 2938516720 984194 2937532526 Memory allocation 50677370555 15544618942 35132751613 Class 797597608 234863749 562733859 59631869392 15800575679 43831293713 Testien nanotime tuloksista lasketut suhteelliset nopeuserot on esitetty taulukossa 5. 5

Taulukko 5 Testien suhteelliset nopeuserot Testi Tac-7028 Galaxy S Keskiarvo 1 0.08 1.32 0.70 2 714.54 846.23 780.38 3 1773.22 2194.19 1983.70 4 1244.47 186.08 715.27 5 2985.71 3811.77 3398.74 6 3.26 4.26 3.76 7 3.40 5.29 4.34 4. Huomioitavaa tuloksista 3.77 5.63 4.70 Tuloksia tarkastellessa täytyy huomioida jo edellä mainittu ylimääräinen viive natiivikoodin suorituksessa. 4.1. Testi 1 Testin 1 tulokset vaihtelivat hämmästyttävän paljon testiohjelman eri versioiden välillä. Debug-versiolla virtuaalikone oli aina noin kolme kertaa niin nopea kuin natiivikoodi, mutta releaseversiolla erot tasoittuivat tai Galaxy S:n tapauksessa jopa kääntyivät päinvastaisiksi. Tästä päätellen release-käännökseen tehdään optimointeja, jotka nopeuttavat normaaleja funktiokutsuja. 4.2. Testi 6 Muistinvaraustestissä oli alunperin tarkoitus myös mitata muistin vapauttamiseen kuluva aika, mutta Dalvikin roskankerääjää ei kuitenkaan pystytty pakottamaan vapauttamaan muistia tietyllä hetkellä eikä efektiivisesti, mikä johti muistin loppumiseen testin aikana. Ongelma toistui luokkatestin aikana, jolloin varaustestissä käytetty muisti oli mahdollisesti edelleen varattuna ja ainoa keino estää ohjelmaa kaatumasta, oli vähentää varattavan muistin määrää huomattavasti. Tässä tutkimuksessa ei siis lopulta mitattu muistin vapautusnopeutta, mutta testiohjelman kehitysversiolla saadut tulokset olivat samassa nopeusluokassa varauksen kanssa. Jos virtuaalikoneella yritetään varata enemmän muistia kuin se sallii, ohjelma pakotetaan sulkeutumaan. Näin ei kuitenkaan tapahdu natiiviohjelmalla, jonka muistinkäyttö on linux-ytimen vastuulla. Natiiviohjelmalla ei ole asetettua muistinkäyttörajoitusta, virtuaalikone sammuttaa taustalla olevia sovelluksia niin kauan, että natiiviohjelmalle on saatavilla tarpeeksi muistia. Mikäli natiiviohjelma yrittää varata enemmän muistia, kuin laitteessa on, sovellus kaatuu ilman näkyvää virheilmoitusta. 4.3. Testi 7 Muistiongelmat ilmenivät myös luokkatestissä, jossa luodaan 100000 oliota. Kuitenkin ani harvassa 6

todellisessa sovelluksessa on tarvetta näin suurelle objektimäärälle, joten nämä muistiongelmat tuskin ilmenevät käytännössä. 5. Lopputulokset Vaikka nopeuserot virtuaalikoneen ja natiivikoodin välillä näyttävät todella hurjilta, tulee muistaa, että tämä testiohjelma oli tarkoitettu nimenomaan esittämään erot mahdollisimman selvästi. Testitapaukset eivät ole järin kuvaavia mobiililaitteen peruskäytöstä. Vielä tärkeämpi huomio on, että esimerkiksi yksi yhteenlaskutesti vei keskimäärin 6 millisekuntia aikaa Tac-7028 testilaitteella ja Galaxy S:llä vielä vähemmän. Kuten Android NDK:in dokumentaatiossa todetaan, natiivikoodista ei ole hyötyä useimmille sovelluksille, mutta se monimutkaistaa kehitysprosessia huomattavasti. Mikäli sovellus aiotaan kääntää alustalta toiselle (ja muutkin alustat tukevat natiiveja ohjelmia) on perusteltua käyttää NDK:iä. Toinen mahdollinen käyttökohde on äärimmäisen raskaat pelit, joka on itselläni syy natiivikoodin käyttöön. Tämä testi suoritettiin ns. low end-laitteilla, mutta näilläkin kävi ilmi laitekohtaiset suorituskykyerot sekä virtuaalikoneella, että natiiviohjelmilla. Tac-7028:n 1GHz:n prosessori hävisi useimmissa testeissä Galaxy S:n vain 800MHz prosessorille. Mikäli testissä olisi ollut mukana tehokkaampia moniytimisiä laitteita, olisi nopeuserot varmasti kaventuneet huomattavasti. 7

6. Lähteet Dan Bornstein, Dalvik VM internals, 2008 viitattu 2.12.2012 https://sites.google.com/site/io/dalvik-vm-internals/ Android NDK documentation, viitattu 2.12.2012 http://developer.android.com/tools/sdk/ndk/index.html 8