Java I / O vs NIO: quick test comparison

I recently read that Java I / O works better on newer computers than NIO due to the new availability of multi-core machines.

I checked a quick check by comparing the I / O and NIO transmission times over the local network using the local loopback address.

Note. This is the use of JDK 7

Results (3 studies):

Inputs / outputs average 21789.3ms

NIO transfers averaged 22771.0ms

It is also worth noting that with each transfer of NIO processor performance is approximately 10% higher.

My question is for you, if my comparison code is fair? Did I write good / equal I / O and NIO codes? If not, how can I improve and re-run this test?

public static void main(String[] args) { System.out.println("Initiating test sequence..."); new Thread(new Client()).start(); try { System.out.println("Server I/O initiating..."); ServerSocket server = new ServerSocket(5555); Socket sock = server.accept(); System.out.println("Server connected to client successfully"); InputStream is = sock.getInputStream(); File output = new File("C:/test_root/video.avi"); FileOutputStream fos = new FileOutputStream(output); byte[] data = new byte[1024]; int len=0; System.out.println("Server initiating transfer - Timer starting"); long start = System.currentTimeMillis(); while((len=is.read(data))>0) { fos.write(data, 0, len); fos.flush(); } fos.close(); is.close(); sock.close(); server.close(); long end = System.currentTimeMillis(); System.out.println("Network I/O transfer time = "+(end-start)+"ms"); System.out.println("Server NIO initiating..."); ServerSocketChannel serverChan = ServerSocketChannel.open(); serverChan.bind(new InetSocketAddress(5555)); SocketChannel chan = serverChan.accept(); chan.configureBlocking(false); System.out.println("Server channel connected"); FileChannel fc = (FileChannel) Files.newByteChannel(Paths.get("C:/test_root/video.avi"), StandardOpenOption.CREATE, StandardOpenOption.WRITE); ByteBuffer buff = ByteBuffer.allocate(1024); System.out.println("Server initiating transfer - Timer starting"); start = System.currentTimeMillis(); while(chan.read(buff)>=0 || buff.position() > 0) { buff.flip(); fc.write(buff); buff.compact(); } chan.close(); fc.close(); serverChan.close(); end = System.currentTimeMillis(); System.out.println("Network NIO transfer time = "+(end-start)+"ms"); } catch (IOException e) { e.printStackTrace(); } System.out.println("Test completed!"); } static class Client implements Runnable { public void run() { try { System.out.println("Client I/O initiating..."); Socket sock = new Socket("localhost", 5555); System.out.println("Client connected to server successfully!"); OutputStream os = sock.getOutputStream(); File input = new File(System.getProperty("user.home")+"/Documents/clip0025.avi"); FileInputStream fis = new FileInputStream(input); byte[] data = new byte[1024]; int len=0; int tot=0; int perc=0; while((len=fis.read(data))>0) { os.write(data, 0, len); os.flush(); tot+=len; int prev = perc; perc = getPercentage(tot, input.length()); if(perc !=prev && (perc == 10 || perc == 25 || perc == 50 || perc == 75 || perc == 98)) System.out.println("Client reporting: "+perc+"% read"); } os.close(); fis.close(); sock.close(); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Client NIO initiating..."); SocketChannel sc = SocketChannel.open(); boolean connected = sc.connect(new InetSocketAddress("localhost",5555)); if(!connected) connected = sc.finishConnect(); if(!connected) throw(new IOException("Client failed to connect")); System.out.println("Client channel connected"); sc.configureBlocking(false); FileChannel fc = (FileChannel) Files.newByteChannel(input.toPath(), StandardOpenOption.READ); ByteBuffer buff = ByteBuffer.allocate(1024); len=0; tot=0; while((len=fc.read(buff))>=0||buff.position()>0) { buff.flip(); sc.write(buff); buff.compact(); tot+=len; int prev = perc; perc = getPercentage(tot, input.length()); if(perc !=prev && (perc == 10 || perc == 25 || perc == 50 || perc == 75 || perc == 98)) System.out.println("Client reporting: "+perc+"% read"); } sc.close(); fc.close(); } catch (IOException e) { e.printStackTrace(); } } } 

Additional Information:

Windows Vista (SP2) on Dell Studio XPS 435MT

1st generation i7 quad core 2.67 GHz

RAM 6 GB

64-bit architecture

+6
source share
1 answer

suggestions

  • Try comparing IO lock with NIO lock. Your code will be shorter. If you are going to test IO, use IO on the client and server. If you intend to use NIO, use them at both ends.
  • Use direct byte buffers.
  • Do not read / write files, as they are not part of the standard and can be much slower. Just walk around empty data blocks.
  • Try using different block sizes, for example. 8 KB
  • Consider the type of data you want to exchange. for example ByteBuffer can make reading int and long more efficient.
  • Report numbers in terms of bandwidth. I would expect to see 1 to 3 GB / s on the return line.

http://vanillajava.blogspot.com/2010/07/java-nio-is-faster-than-java-io-for.html

+3
source

Source: https://habr.com/ru/post/907711/


All Articles