[Java] byte[] -> String snel

Pagina: 1
Acties:

  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
hoewel het geen echt probleem is vertraagd een deel van mijn code naar mijn zin iets te veel.

Ik stuur een byte[] array encoded met base64 via XML-RPC door van mijn server naar mijn client. (ik MOET XML-RPC gebruiken dus daar erger ik me niet aan).

nu die byte[] is eigenlijk een structuur die ik zelf bouw die Data van een DB doorstuurt (row/col). Ik had dit al in puur XML-RPC gedaan maar aangezien die voor elk veld in elke row effe gaat zeggen wat type dit is plus nog encoden vond ik dat wel snel erg groot/traag worden.

ik doe dus op de server ies van
Java:
1
2
3
4
5
6
7
8
    ByteArrayOutputStream bos = new ByteArrayOutputStream(65000); 
    DataOutputStream dos = new DataOutputStream(bos);
    dos.writeInt(tColumns);
    
   //en voor elke string die ik will doorgeven
    int tLength = myString.length();
    dos.writeInt(tLength); //zodat ie niet moet zoeken naar eind string...
    dos.writeBytes(myString); //geen unicode required 


nou goed dat gaat lekker. (als dat al sneller kan... graag weten)

maar op de client moet ik die strings dus gaan 'parsen' en daar vind ik helemaal
geen goede standard voort dus schreef ik dit:

Java:
1
2
3
4
5
6
7
8
9
10
 static private String readString(DataInputStream aDIS, int length) throws Exception
  {
    StringBuffer tSB = new StringBuffer(length);
    while (length > 0)
    {
      tSB.append((char)aDIS.readByte());
      length--;
    }
    return tSB.toString();
  }


maar dat vind ik zo oerlelijk en lijkt me ook traag - enig idee hoe je als je weet hoeveel bytes (chars) moet uitlezen van een byte[] je dit sneller in een String
krijgt. Begin wel te snappen waarom Java op string gebied echt wel traag is...

als zo'n optimize vraag niet ter orde is op het forum dan apologies... Maar als vroeger assembler coder geobsedeerd door speed vroeg ik me het gewoon af. weet ik direct of ik in de toekomst daar met java nog mee moet bezig zijn op ineens opgeven :)

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Als je snelle IO wilt is er maar 1 goede oplossing: nio. In dit geval kan de byte -> string conversie waarschijnlijk ook enorm veel sneller gedaan worden met de nio klassen.

Je kan een ByteBuffer gebruiken en deze decoden naar een CharBuffer. Dit kan je doen met java.nio.charset.Charset.decode . Overigens is er uiteraard ook een encode methode ;) . Werkt allemaal erg fraai moet ik zeggen :) .

http://java.sun.com/j2se/.../nio/charset/Charset.html

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • PommeFritz
  • Registratie: Augustus 2001
  • Laatst online: 10-07 04:13

PommeFritz

...geen friet

Weet je zeker dat dat laatste stukje code (met die readByte) traag is en de bottleneck vormt? Als dat zo is, dan pas gaan optimaliseren.
Gebruik eens de read(byte[] data) methode van de DataInputStream ipv elke byte per stuk inlezen, en dan een String maken met new String(data, "UTF-8"). data is je bytearray. Verander UTF-8 als je een andere encoding gebruikt.

FireFox - neem het web in eigen hand


  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
bedankt voor de tips - uiteindelijk leidde beide paths uiteindelijk naar een ByteToChar convertor (nio :). Deze zit in rt.jar dus ben ik nu bezig de SDK (source) aan het downen - om effe te zien wat ie doet maar ik neem aan een JNI... dus mbravenboer wist hoe het echt werkt en pommefritz hoe het het eenvoudigst te implementeren valt :) (maar wat een omwegen en mogelijke error dat ie throwed :) ... cool ...

  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
niet dus :) hij doet gewoon een charArray[offset] = (char)byteArray[offset]... en met die UTF encoding komen daar nog een hele hoop ifs, bitwise ands and ors bij :) ...

dus in feite (heb het nog niet gebenched) is mijn oplossing nog in theorie de snelste...

die source van Java VM is wel interessant:

C++:
1
void ClassLoader::compile_the_world_in()


:)

[ Voor 19% gewijzigd door hobbit_be op 15-02-2003 23:23 ]