On Monday 29 of August 2005 11:33, 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:
Rozdil bude IMHO v tom, ze java.io porad jeste pouziva stary dobry nativni
read (radeji jsem se dival do zdrojaku, abych zase nemlzil ;-) ), ktery
nemuze zadna obalka kolem nej (jejiz vytvoreni neco stoji) pri
jednouzivatelskem seqencnim pristupu zrychlit. Vyhoda java.nio se ukaze
teprve tehdy, kdyz je potreba opakovane cist, primo pristupovat na jednotlive
byty ci konkurentne pristupovat.
Jinak java.io.FileInputStream sice importuje z java.nio a sun.nio, ale pouze
pro potreby ziskavani kanalu zvenci. V tvem kodu je pouze nativni read a
buffer mas nastaveny na 64kB, coz je pro ty male souborky naprosto
dostacujici, takze overhead s BufferInputStreamem ne projevi az u tech
velkych ;-)
Jinak zkus to dat do cyklu o aspon sto souborech nebo stokrat jeden soubor;
zase tu mame casy v radech milisekund a to uz tu tusim tento tyden nekdo
resil :-D ikdyz souhlasim, ze v tomto pripade to asi nebude tak jednoduche
neco interpretovat, kdyz neustale otevirani a zavirani file deskriptoru take
neco sezere.
> 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 ?
>
> Makub
--
Oto 'tapik' Buchta, [EMAIL PROTECTED]
Senior Engineer, Systinet Corp,
http://www.systinet.com