Große Strings in Java

  • Hi Leute,


    Ich habe zur Zeit ein mittelschweres Problem mit meinem Programm. Im Endeffekt läuft es, aber es dauert halt.
    Ich habe eine Funktion, die aus einem 2D-Array (int) einen großen String macht und in die Datenbank schreibt. Das ganze ist für ein Online-Spiel an dem ich gerade hobbymäßig arbeite:




    Das Problem ist nun, dass die map 100x100 Felder groß ist. Nun, da der Raspberry Pi ja nicht der schnellste ist, dauert die Funktion recht lang was für einen Server mit mehreren Nutzern nicht gerade vom Vorteil ist.


    Nun zu meiner Frage: Gibt es da eine Funktion mit besserer Performance um so ein Array in einen String zu verwandeln?

    Edited once, last by Zaziki ().

  • Evtl. koennte dir das ja helfen:


    import java.util.Arrays;


    System.out.println(Arrays.toString(int_array));


    Oder ging es dir hauptsaechlich um das Befuellen des Arrays?
    Zur Not koenntest du auch evtl. mit Threads arbeiten und die Arbeit verteilen, ob das allerdings beim RPi so viel schneller ist, weiss ich nicht.
    Und was ist, wenn du mit Listen arbeitest? Fuer Listen gibt es schoene Algorithmen mit vernuenftigem Speicher und vorallem Laufzeitverhalten.


    MfG,
    Miau

  • Ja da gibt es elegantere Möglichkeiten.
    Ich habe unten mal Testcode angehängt mit der Ausgabe der Laufzeit des Codes.
    Nutze bitte bei solchen Verkettungen von Strings immer die StringBuilder Klasse:


    Edited once, last by jostereo ().

  • Vielen Dank für eure Beiträge die haben mich echt weitergebracht!


    Ich habe die Klasse von jostereo einmal angepasst und die Methode mit den Arrays.toString(array) hinzugefügt. Das Problem da war aber, dass ich dort die " " (Leertasten) ersetzen und die [ ] rausnehmen musste. Dadurch wird es wahrscheinlich etwas langsamer.
    Hier die Klasse:



    Wenn ich das ganze mit echten Daten füttere kommen folgende Zeitergebnisse:

    Code
    ArrayConcat     Dauer in Millisekunden: 246ms
    StringBuilder   Dauer in Millisekunden: 178ms
    String          Dauer in Millisekunden: 7748ms


    An einen StringBuilder hätte ich auch gleich denken können :D

    Edited once, last by Zaziki ().

  • Zaziki
    Sind die Werte von einem Raspberry Pi? (Finde ich schon krass für so ein kleines Array fast 7 sec zu verbraten)



    Ja das mit dem StringBuilder musste ich mir auch mehrmals vor Augen führen so dass sich das bei mir festgebrannt hat.


    Das ist genauso wie:


    Stringvergleiche mit "equals" machen und nicht mit "==". :thumbs1:

  • Jop alle Daten die hier sind, sind von meinem Pi Modell B (512MB RAM). Der ist aber auch nicht übertaktet oder sonstiges.
    Das mit den 7 Sekunden ist wirklich krass, ich kann mir auch nicht erklären warum der sooo lange braucht.


    //Edit:
    Ich habe oben die Klasse, genauer gesagt die Methode arrayConcat angepasst. Spart nochmal ca 200ms. Dort wird jetzt auch ein Stringbuilder eingesetzt. Das ganze ist aber noch ca 70ms langsamer als der reine Stringbuilder. Das ganze wird wohl daran liegen, dass ich das Ergebnis von Arrays.toString() bearbeiten muss. Aber ansonsten bestimmt eine nette Alternative!

    Edited once, last by Zaziki ().

  • Schnellste Methode sollte echt der einzelne StringBuilder mit der Doppelschleife sein.
    Wenn man sich die Implementierung von Arrays.toString(int[] a) mal anschaut, kommt einem der Quellcode bekannt vor. Darin wird also auch für jedes Array ein StringBuilder erzeugt.



    Außerdem bekommst du leider über das Arrays.toString(int[] a) eine Zeichenkette mit [].