# JNI: Auf ArrayList und Klassen zugreifen



## Capasso (6. Mai 2009)

Hi,

ich hab eine Methode :


```
public native int doX(String strat, String string1, String string2, int max);
```

die zwei String aufwendig verarbeitet und sehr oft aufgerufen wird.
Um die Verarbeitung zu beschleunigen habe ich diese Methode per JNI in C implementiert, was auch einwandfrei funktioniert.
Leider ist die Bearbeitung für 700.000 Strings in C langsamer als in Java, was wahrscheinlich daran liegt, dass die Methode, von Java aus, 700.000 mal aufgerufen wird.

Also habe ich mir gedacht, direkt alle 700.000 Strings als ArrayList<String> an eine C-Methode zu übergeben. Diese bearbeitet dann alle erst alle String und gibt eine ArrayList<Klasse> zurück.


```
public native List<myWord> doWordsToList(String word, List<String> wortListe, boolean sa, int max);
```

Leider weiß ich nicht wie ich auf die ArrayListen<String> in c zugreife, sofern das geht, bzw. wie ich eine ArrayList<myWord> in C erzeuge.

Geht das überhaupt


----------



## maki (6. Mai 2009)

> Um die Verarbeitung zu beschleunigen habe ich diese Methode per JNI in C implementiert,


Dann nehme ich an dass du das Ding durch einen Profiler gejagt hast und rausgefunden hast dass es keine Möglichekit gibt es in Java zu beschleunigen? 
Oder hast du einfach geraten/gefühlt dass es mit JNI "besser" wäre?

Würde wegen Stringverarbeitung nicht auf JNI/C ausweichen, richtig gemacht kann das in Java sogar schneller gehen.
Profiler helfen dir dann auch bei der Suche nach Flaschenhälsen.

Mit deiner Lösung wird das alles sehr kompliziert...


----------



## tfa (6. Mai 2009)

Da kann ich nur zustimmen. JNI und C ist dafür da, auf Hardware-nahe oder betriebssystemspezifische Sachen zuzugreifen. Wer glaubt, damit Performance steigern zu können, fährt praktisch immer gegen die Wand. 
Wirf den C-Kram weg und optimiere die Java-Methode wenn nötig.


----------



## Capasso (6. Mai 2009)

Schade, ich würde das gerne ausprobieren.


Welcher Profiler ist denn zu empfehlen ?


----------



## maki (6. Mai 2009)

Kannst mal Eclipse TPTP ausprobieren, am besten das komplett Packet runterladen und nicht versuchen als Plugin zu installieren.

Ansonsten sei nochmals auf die 80/20 Regel verwiesen, 20% des Programms brauchen 80% der Ressourcen 
"Blindes" Optimieren bringt meist gar nix ausser schlechtes/komplexes Design, Performance sollte beim Design ausser aucht gelassen werden, optimieren tut man nur wenn es wirklich zu langsam läuft, und ein gutes Design lässt sich leichter Optimieren als ein Design das von Haus aus auf Performance ausgelegt ist, diese aber nicht bringt.


----------



## Capasso (6. Mai 2009)

maki hat gesagt.:


> Ansonsten sei nochmals auf die 80/20 Regel verwiesen, 20% des Programms brauchen 80% der Ressourcen



Das Programm besteht zum größten Teil nur aus dieser einen Methode.


----------



## tfa (6. Mai 2009)

Warum programmierst du es dann nicht ganz in C?


----------



## maki (6. Mai 2009)

..und trotzdem hat deine JNI "Optimierung" nichts gebracht ausser längerer Laufzeit 

Aber zeig doch mal die Methode


----------



## ARadauer (6. Mai 2009)

> Welcher Profiler ist denn zu empfehlen ?


wir sind der beste Profiler ;-) zeig mal deinen Code....


----------



## maki (6. Mai 2009)

> wir sind der beste Profiler  zeig mal deinen Code....


Naja, da würde ich nicht unbedingt zustimmen


----------



## Capasso (6. Mai 2009)

tfa hat gesagt.:


> Warum programmierst du es dann nicht ganz in C?



Weil das Teil eines RMIServers ist.



> wir sind der beste Profiler  zeig mal deinen Code....


geht leider nicht


----------



## tfa (6. Mai 2009)

Tja, dann kann man nur raten....

Benutze StringBuilder.
Vermeide Stringkonkatenation in Schleifen.
Verwendest du reguläre Ausdrücke? Die können auch teuer sein.
Hast du überhaupt Performanceprobleme oder willst du es einfach nur so schneller haben?
JNI ist jedenfalls nicht die Lösung.


----------



## Capasso (6. Mai 2009)

tfa hat gesagt.:


> Tja, dann kann man nur raten....
> 
> Benutze StringBuilder.
> Vermeide Stringkonkatenation in Schleifen.


Ich erzeuge keine neuen Strings und verändere auch keine alten.
Ich vergleiche lediglich character an bestimmten Positionen und berechne int Werte und vergleiche diese dann oder addiere sie oder schreibe sie in ein vorhandenes Array.
Ich erzeuge nichtmal ne Referenz bzw. neue Objekte. (OK einmal am Anfang aber dann benutze ich für alle 700.000 Strings die selben)




tfa hat gesagt.:


> Verwendest du reguläre Ausdrücke? Die können auch teuer sein.


Nein



tfa hat gesagt.:


> Hast du überhaupt Performanceprobleme oder willst du es einfach nur so schneller
> haben?


Nein. Ich versuche nur das letzte bisschen Geschwindigkeit rauszuholen.


----------



## tfa (6. Mai 2009)

Capasso hat gesagt.:


> > Hast du überhaupt Performanceprobleme oder willst du es einfach nur so schneller
> > haben?
> 
> 
> Nein. Ich versuche nur das letzte bisschen Geschwindigkeit rauszuholen.


Dann ist doch alles OK. Du hast kein Problem, also versuche nicht, es zu lösen.
"Premature Optimization" ist die Wurzel allen Übels.


----------

