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

Odpovedet emailem