Kokeilinpa eilen tehdä ensimmäisen natiivimetodin sovellukseen. Homma oli yksinkertainen, kahden isohkon int-taulukon alkioiden yhdistäminen, mahdollisimman monta kertaa sekunnissa.
Täytyy sanoa, että kylläpä yllätyin. C-toteutus on nimittäin JNI:n avulla käytettynä 5 kertaa hitaampi kuin "identtinen" koodi Javalla toteutettuna.
Joo, oli mulla optimointi-hanikat päällä.
Onko kukaan törmännyt vastaavaan? Ratkaisuja? Vinkkejä?
Täytyy sanoa, että kylläpä yllätyin. C-toteutus on nimittäin JNI:n avulla käytettynä 5 kertaa hitaampi kuin "identtinen" koodi Javalla toteutettuna.
Joo, oli mulla optimointi-hanikat päällä.
Onko kukaan törmännyt vastaavaan? Ratkaisuja? Vinkkejä?
Vastaukset 3
Vanhimmat
Minusta JNI:n tarkoitus ei olekaan olla kauheen tehokas. Käsittääkseni sillä annetaan vain mahdollisuus käyttää sellaisia ominaisuuksia, joita Java ei itse pysty tekeen.
Esimerkiksi saada joku yhteys kerneliin vaikka jonkun .dll:n kautta.
Joo. Toki.
Ja kyllähän natiivirutiinit on nopeampia jos tehtävää on paljon. Kun tein jokaiselle taulukon alkiolle jotain temppuja (sqrt, pow, jne) alkoi ero c:n ja javan nopeudessa tasoittua.
Ilmeisesti kutsuissa JNI:n läpi tulee melkoisesti overheadia.
Käytössä on Java 1.4.x. Sunin foorumeilla on näemmä valitettu tästä samasta aiheesta. Ilmeisesti JNI:n käyttö on jopa hidastunut versiosta 1.3...
No, ei muuta kuin suunnitelmat uusiksi.
JNI:n tarkoitus on olla mahdollisiman tehokas. Jos tutkailet javan sorsia, niin huomaat, että loppujen lopuksi kaikki io, net yms. objektit käyttää JNI:n kutsuja. Java api muodostaa vaan ohjelmointi interfacen, jonka virtuaali kone toteuttaa JNI:n kautta.