On Mon, Aug 29, 2005 at 11:33:27AM +0200, Martin Kuba wrote:
> [EMAIL PROTECTED] wrote:
> > V tomto konkretnim pripade navic jeste je dobre pouzit NIO kvuli vykonu
> >(je to obrovsky rozdil), ale hlavni je funkcnost.
>
> Zkusil jsem si ted porovnat klasicke IO a NIO a vychazi mi, ze NIO
> je pomalejsi:
>
> import java.io.*;
> import java.nio.channels.*;
>
> public class Copy {
> static final int BUFSIZE = 1024*64;
> public static void main(String args[]) throws IOException {
> if(args.length!=2) {
> System.err.println("Usage: java Copy <src_file> <dst_file>");
> System.exit(1);
> }
> long t1 = System.currentTimeMillis();
> classicIO(args[0],args[1]+".old");
> long t2 = System.currentTimeMillis();
> newIO(args[0],args[1]+".new");
> long t3 = System.currentTimeMillis();
> System.out.println("size: "+(new File(args[0]).length())+"
> CLASSIC: "+(t2-t1)+"ms NIO: "+(t3-t2)+"ms");
> }
>
> static void classicIO(String src,String dst) throws IOException {
> BufferedInputStream in = new BufferedInputStream(new
> FileInputStream(src),BUFSIZE);
> BufferedOutputStream out = new BufferedOutputStream(new
> FileOutputStream(dst),BUFSIZE);
> byte[] buffer = new byte[BUFSIZE];
> int nacteno;
> while((nacteno=in.read(buffer,0,BUFSIZE))>0) {
> out.write(buffer,0,nacteno);
> }
> in.close();
> out.close();
> }
> static void newIO(String src,String dst) throws IOException {
> FileChannel in = new FileInputStream(src).getChannel();
> FileChannel out = new FileOutputStream(dst).getChannel();
> out.transferFrom(in,0,in.size());
> in.close();
> out.close();
> }
> }
>
> Kdyz spustim:
>
> size: 4589 CLASSIC: 1ms NIO: 12ms
> size: 37400824 CLASSIC: 135ms NIO: 121ms
>
> tj. pro dlouhe soubory se to srovnava, ale pro male je klasicke IO
> rychlejsi. Jak to ?
Popularni nio je proste vice low-level pristup. Takze prechod
na nio ma smysl
1) pokud se topite ve stovkach threadu, na nez zakonite vede naivni
implementace masove vyuzivaneho serveru (napr. web serveru), a to
predevsim, pokud vetsina tech threadu se jen nudi cekajic, zda se laxnim
uzivatelum nezlibi poslat pozadavek
2) pokud vite presne, co chcete delat jinak nez io, napriklad
v zajmu rychlosti. Napriklad Vam vadi nekolikanasobne kopirovani dat po pameti
a alokace vselijakych pomocnych objektu tam, kde byste treba mohl pametove
namapovat binarni soubor, zorientovat se v nem pomoci primitivnich typu,
zmenit v nem par bajtu a hotovo.
V ten moment je nio dar z nebes. Jinak je to zbytecne zneprehledneni a
zpomaleni kodu, protoze napr. poll() je pochopitelne pomalejsi, nez synchronni
read() na jediny kanal - a to jeste Suny podezrivam, ze mozna kvuli
prenosnosti pouzivaji vzdy select(), kterezto API s bitovymi poli pevne delky
lze omluvit pouze jeho stareckymi sedinami a rozsirenosti.
Tvrzeni, ze "nio je rychlejsi nez io", je povera sirena proto, abychom se
vsichni naucili nio pouzivat a nadale si mohli vybirat z io a nio dle
momentalni potreby :-)
Jirka