Avatar billede jespersahner Nybegynder
12. november 2004 - 01:00 Der er 2 kommentarer og
1 løsning

NIO og View Buffer'e

Af performance-hensyn ønsker jeg at bruge Java NIO og dermed Channel/Buffer-setup'et.

Når en Buffer fyldes med data, kan det ske direkte ved anvendelse af type-specifikke put()-metoder, f.eks. putInt(), putDouble() osv. Alternativt kan man fylde Buffer'en gennem en View Buffer og dermed bare put()-metoden.

Så vidt jeg har kunnet læse mig til, er View Buffer'e til for at gøre det lettere at fylde Buffer'en med data, idet man bare bruger put()-metoden. Til gengæld skal man hele tiden opdatere positionen i Buffer'en manuelt, idet View Buffer'en ikke sørger for dette.

Hvori består det forenklede i brugen af View Buffer'e i forhold til blot at skrive direkte i Buffer'en med relevante put()-metoder?

Er der noget performance-mæssigt at hente ved at bruge View Buffere frem for direkte skrivning til Buffer?
Avatar billede simonvalter Praktikant
12. november 2004 - 18:14 #1
jeg skal ikke selv kunne udtale mig om det men måske giver dette mening for dig:

http://javadiff.sourceforge.net/jdiff/reports/j2se140_j2se141_docs/changes/docdiffs_java.nio.html >
A view buffer is potentially much more efficient because it will be direct if and only if its backing byte buffer is direct.

Java New IO High Performance Java IO And Regular Expressions - Ron Hitchens

View buffers can potentially be much more efficient when derived from direct byte buffers. If the byte
order of the view matches the native hardware byte order, the low level code may be able to access the
data values directly rather than going through the byte packing and unpacking process.
Avatar billede jespersahner Nybegynder
26. november 2004 - 12:45 #2
->simonvalter: Takker.

Eget eks.:

import java.io.*;
import java.nio.*;
import java.nio.channels.FileChannel;

public class Bytebuffer {
    public static void main(String[] args) throws IOException {
        // Opretter fil og channel
        //File f=new File("h:/java/projects/diverse/bytebuffer.dat");
        File f=new File("c:/dat/bytebuffer.dat");
        boolean bo=f.createNewFile();
        FileOutputStream fos=new FileOutputStream(f);
        FileChannel fc=fos.getChannel();
        int totantal=1000000; // Total antal records
        int antal=100; // Antal records i buffer'en
        int[] i=new int[5];
        double[] d=new double[5];
        byte[] c=new byte[5]; //char[] c=new char[5];
        long starttid = System.currentTimeMillis();
        ByteBuffer buf = ByteBuffer.allocate(antal*(4*i.length+8*d.length+1*c.length)); // 2*c.length
        // Opretter arrays der skal skrives til buffer
        int _totantal=0;
        for (;;) {
            i[0]=1;
            i[1]=2;
            i[2]=3;
            i[3]=4;
            i[4]=5;
            d[0]=1.1;
            d[1]=2.1;
            d[2]=3.1;
            d[3]=4.1;
            d[4]=5.1;
            c[0]=(byte)'A';
            c[1]=(byte)'B';
            c[2]=(byte)'Æ';
            c[3]=(byte)'Ø';
            c[4]=(byte)'+';
            for (int k=0;k<antal;k++) {
                buf.position(buf.position()+4*buf.asIntBuffer().put(i).position());
                buf.position(buf.position()+8*buf.asDoubleBuffer().put(d).position());
                buf.put(c); //buf.position(buf.position()+2*buf.asCharBuffer().put(c).position());
            }
            buf.flip();       
            fc.write(buf);
            buf.clear();
            _totantal=_totantal+antal;
            if (_totantal==totantal) break;
        }
        fos.close();
        long sluttid = System.currentTimeMillis();
        System.out.println("Tidsforbrug "+ (sluttid-starttid)*0.001 +" sek.");
    }   
}
Avatar billede jespersahner Nybegynder
26. november 2004 - 12:45 #3
Lukker spm.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester