测试java NIO/IO流磁盘操作对性能

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/minaki_/article/details/88807450

知识点总结 https://blog.csdn.net/minaki_/article/details/86717426
nio和io区别详解 https://www.cnblogs.com/hapjin/p/5736188.html
测试code来源thinking in java

package io.nio;

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

// 测试NIO(文件映射)和IO流磁盘操作对性能,单位(秒)
// 普通io并未使用缓存
public class MapperIO {
    private static int numOfInts = 200000;  // 读写次数

    private abstract static class Tester {
        private String name;
        public Tester(String name) {
            this.name = name;
        }

        public void runTest() {
            System.out.print(name + ": ");
            try {
                long start = System.nanoTime();
                test();
                double duration = System.nanoTime() - start;
                System.out.format("%.2f\n", duration/1.0e9);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
        public abstract void test() throws IOException;
    }

    private static  Tester[] tests = {
            new Tester("Stream Write") {
                @Override
                public void test() throws IOException {
                    DataOutputStream dos = new DataOutputStream(
                            new BufferedOutputStream(
                                    new FileOutputStream(new File("temp.tmp"))));

                    for(int i = 0; i < numOfInts; i++) {
                        dos.writeInt(i);
                    }
                    dos.close();
                }
            } ,  new Tester("Mapped Write") {
                @Override
                public void test() throws IOException {
                    FileChannel fc =
                            new RandomAccessFile("temp.tmp", "rw").getChannel();
                    IntBuffer ib = fc.map(FileChannel.MapMode.READ_WRITE, 0, fc.size()).asIntBuffer();
                    for(int i = 0; i < numOfInts; i++) {
                        ib.put(i);
                    }
                    fc.close();
                }
            },
            new Tester("Stream Read") {
                @Override
                public void test() throws IOException {
                    DataInputStream dis = new DataInputStream(
                            new BufferedInputStream(new FileInputStream("temp.tmp")));
                    for(int i = 0; i < numOfInts; i++) {
                        dis.readInt();
                    }
                    dis.close();
                }
            },  new Tester("Mapped Read") {
                @Override
                public void test() throws IOException {
                    FileChannel fc =
                            new RandomAccessFile("temp.tmp", "rw").getChannel();
                    IntBuffer ib = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size()).asIntBuffer();
                    while (ib.hasRemaining()){
                        ib.get();
                    }
                    fc.close();
                }
            },  new Tester("Stream Read/Write") {
                @Override
                public void test() throws IOException {
                    RandomAccessFile fc =
                            new RandomAccessFile("temp.tmp", "rw");
                    fc.writeInt('a');
                    for(int i = 0; i < numOfInts; i++) {
                        fc.seek(i*4);
                        fc.writeInt(fc.readInt());
                    }
                    fc.close();
                }
            },
            new Tester("Mapped Read/Write") {
                @Override
                public void test() throws IOException {
                    FileChannel fc =
                            new RandomAccessFile("temp.tmp", "rw").getChannel();
                    IntBuffer ib = fc.map(FileChannel.MapMode.READ_WRITE, 0, fc.size()).asIntBuffer();
                    ib.put('b');
                    for(int i = 1; i < numOfInts; i++) {
                        ib.put(ib.get(i-1));
                    }
                    fc.close();
                }
            }
    };
    public static void main(String[] args) {
        for (Tester test : tests) {
            test.runTest();
        }
    }
}
/*output:
Stream Write: 0.02
Mapped Write: 0.01
Stream Read: 0.02
Mapped Read: 0.00
Stream Read/Write: 5.26
Mapped Read/Write: 0.01
* */

猜你喜欢

转载自blog.csdn.net/minaki_/article/details/88807450
今日推荐