Java字节文件读写(3): BufferedInputStream和BufferedOutputStream及内存性能测试

Buffered*Stream 简介

这两个类也是派生于InputStream和OutputStream,所以用法基本和前言也差不多。但是主要的区别有以下几点:

  • 构造函数必需使用一个已有的流,如:BufferedOutputStream fout = new BufferedOutputStream(new ByteArrayOutputStream());
  • 这个函数中没有available()或size()属性

测试与分析

这两个类主要的目的就是提供缓冲,以实现更好的情况。但是就目前的内存测试来看,和预期不符合。测试的主要内容如下:
先建立指定大小的字节数据,如 byte[] bts = new byte[1024] 表示一个1K的数组,下面是不同大小的数组使用 write(byte[]) 函数写入 1GB内存数据的时间(PS:write(byte) 效率极差,用时13秒左右)。每个测试执行50次,去掉最好和最差的10次,然后求平均值。结果如下:

每次写入量 缓冲 非缓冲
1K 196.53 187.03
2K 194.44 178.61
4K 197.16 177.68
8K 191.69 180.54
16K 188.2 178.85
32K 188.64 177.34
64K 188.31 176.23
128K 187.24 175.33
256K 187.81 174.84
1024K 187.29 174.7

测试代码

import java.io.*;
import java.util.*;

public class ByteArrayDemo {

	public static void main(String[] args) throws Exception {
		List<Long> list = new ArrayList<>();
		int[] blocksizes = { 1, 2, 4, 8, 16, 32, 64, 128, 256, 1024 };
		for (int b = 0; b < blocksizes.length; b++) {
			for (int i = 0; i < 50; i++)
				list.add(filetest(blocksizes[b] * 1024));
			list.sort((v1, v2) -> v1.compareTo(v2));

			int count = 0;
			double total = 0;
			for (int i = 10; i < list.size() - 10; i++) {
				total += list.get(i);
				count++;
			}

			System.out.printf("%4dK: %.2f\n", blocksizes[b], total / count);
		}
	}

	static long filetest(int blocksize) throws Exception {
		int length = 1024 * 1024 * 1024;
		byte[] bts = new byte[blocksize];
		for (int i = 0; i < bts.length; i++)
			bts[i] = (byte) (Math.random() * 256);
			
		BufferedOutputStream fout = new BufferedOutputStream(new ByteArrayOutputStream(length));
		// ByteArrayOutputStream fout = new ByteArrayOutputStream(length);
		long t1 = System.currentTimeMillis(); 
		for (int i = 0; i < length / blocksize; i++)
			fout.write(bts);
		long t2 = System.currentTimeMillis(); 
		fout.close();
		return t2 - t1;
	}
}

你可能感兴趣的:(Java程序设计,性能测试)