Hallo,
Echt tolles Forum hier (auch noch in deutsch). Deshalb hier meine erste Frage:
Ich arbeite gerade an einem XML-Parser, der sowohl das alte IO API (java.io.*), als auch das neue (java.nio.*) als Eingabequelle für die Zeichen untersützt.
Die Vorgehensweise zum Lesen beim alten API ist folgende:
- Per Reader.read() in einen char-Puffer (Gr.: 2048) füllen
- und das das Zeichen an der jeweiligen Position zurückgeben.
Mit NIO:
- Mit einem FileChannel einen ByteBuffer (Gr.: 2048) füllen,
- den ByteBuffer mit einem CharsetDecoder in einen CharBuffer (Gr.: 2048) decodieren
- und mit CharBuffer.get() das jeweilige Zeichen zurückgeben.
Das funktioniert alles perfekt, aber das Problem ist, dass das neue IO API doch spürbar lansamer ist (old IO: ca. 60-70ms , new IO: 110-120ms bei einer XML-Dateigröße von 444 kByte mit JRE 1.4.2_04). Da ich den Zeichensatz der Datei eventl. erst durch den XML-Prolog (bspw. <?xml version="1.1" encoding="windows-1252" ?>) bestimmen kann, muss ich diesen auch nach der Erstellung der Reader- bzw. FileChannel-Objekte ändern können, was leider mit dem alten IO API nicht funktioniert
.
Wo liegt der Performance-Fresser (NIO soll ja doch scheller sein!) oder was habe ich falsch gemacht?
THX,
GNUke
Echt tolles Forum hier (auch noch in deutsch). Deshalb hier meine erste Frage:
Ich arbeite gerade an einem XML-Parser, der sowohl das alte IO API (java.io.*), als auch das neue (java.nio.*) als Eingabequelle für die Zeichen untersützt.
Die Vorgehensweise zum Lesen beim alten API ist folgende:
- Per Reader.read() in einen char-Puffer (Gr.: 2048) füllen
- und das das Zeichen an der jeweiligen Position zurückgeben.
Mit NIO:
- Mit einem FileChannel einen ByteBuffer (Gr.: 2048) füllen,
- den ByteBuffer mit einem CharsetDecoder in einen CharBuffer (Gr.: 2048) decodieren
- und mit CharBuffer.get() das jeweilige Zeichen zurückgeben.
Das funktioniert alles perfekt, aber das Problem ist, dass das neue IO API doch spürbar lansamer ist (old IO: ca. 60-70ms , new IO: 110-120ms bei einer XML-Dateigröße von 444 kByte mit JRE 1.4.2_04). Da ich den Zeichensatz der Datei eventl. erst durch den XML-Prolog (bspw. <?xml version="1.1" encoding="windows-1252" ?>) bestimmen kann, muss ich diesen auch nach der Erstellung der Reader- bzw. FileChannel-Objekte ändern können, was leider mit dem alten IO API nicht funktioniert
Wo liegt der Performance-Fresser (NIO soll ja doch scheller sein!) oder was habe ich falsch gemacht?
THX,
GNUke