声明:我只是为了吸引眼球才把标题写的夸张一点,其实极限我也没测出来{:soso_e113:}
下面进入正题
今天看Buffer缓冲区技术视频,老师在讲解缓冲区技术时举的例子很形象。
在写完复制MP3的代码后,运行正常,最短耗时25毫秒左右。然后将缓冲区设置成2048,耗时没有差别。
之后不知道该怎么做才能提高速度,就去百度了一下。看到一个不使用缓冲区技术的代码,处于好奇就拿来作比较。代码如下:
其中:copy_1是缓冲技术,copy_2不是缓冲技术。
- import java.io.*;
- class Mp3CopyDemo
- {
- public static void mp3Copy_1() throws IOException
- {
- //源:InputStream Reader
- //不是纯文本:选用字节流 InputStream
- //需要高效:BufferedInputStream
- BufferedInputStream bufis = new BufferedInputStream(new FileInputStream("D:\\1.mp3"));
- //目标:OutputStream Writer
- //不是纯文本:选用OutputStream
- //需要高效:BufferedOutputStream
- BufferedOutputStream bufos = new BufferedOutputStream(new FileOutputStream("D:\\2.mp3"));
- int bufsz = 1024;
- byte[] buf = new byte[bufsz];
- int len = 0;
- while((len = bufis.read(buf))!=-1)
- {
- bufos.write(buf,0,len);
- }
- bufis.close();
- bufos.close();
- }
-
- public static void mp3Copy_2() throws IOException
- {
- InputStream is = new FileInputStream("D:\\1.mp3");
- OutputStream os = new FileOutputStream("D:\\3.mp3");
- int bufsz = 1024;
- byte[] buf = new byte[bufsz];
- int len = 0;
- while((len = is.read(buf))!=-1)
- {
- os.write(buf,0,len);
- }
- is.close();
- os.close();
- }
- public static void main(String[] args) throws IOException
- {
- long start = System.currentTimeMillis();
- mp3Copy_1();
- long end = System.currentTimeMillis()-start;
- System.out.println(end+"毫秒");
- start = System.currentTimeMillis();
- mp3Copy_2();
- end = System.currentTimeMillis()-start;
- System.out.println(end+"毫秒");
- }
- }
复制代码 运行结果:
25毫秒
90毫秒
多次运行结果与上述结果差别不大。
然后出现一个疑:
虽然第二个没有使用缓冲技术,但是我也用了一个byte[ ]数组做了个临时缓冲区,为什么运行速度却比不上第一个呢?
通过比较代码,两种方法速度差距不在于读取数据的速度差距上,而是在于写入数据的速度差距上。
事实上,查看源代码可以知道BufferedInputStream中的read(byte[ ] buf)方法在其源代码中并不存在,而是直接继承自
FileInputStream的read(byte[ ] buf)方法。所以两种方法中的read方法并没有区别。
分析速度差距原因:
1、查看源代码可知,第一种方法使用缓冲区技术后只有当缓冲区中的数据达到8192个字节后,BufferOutputStream才会将数据写入硬盘
2、第二种方法虽然有缓冲区,但是大小为1024,缓冲区相差8倍。(至于为什么速度相差4倍左右,没想明白)
验证:
如果把两种方法的缓冲区都设为8192,则运行速度相差无几。
大概19毫秒左右。
然后我将第二种方法扩大8192的整数倍,速度下降的不是特别明显,扩大到4倍的时候大概11毫秒左右。
总结:
其实纯粹追求速度没有什么太大的实际意义,真正意义上的读写速度取决于机器的性能。
但是通过这些思考,能比较深入的了解了缓冲区技术。虽然花了两个多小时的时间,但是值得的{:soso_e113:}
文章中的数据是本人电脑实际测试结果,放到其他机器上可能有差距。文章中有不严谨的地方还请大神指正。
测试MP3由于大于2M无法上传,压缩后也不行,如果想要测试可以到我的百度网盘下载,链接如下:
http://pan.baidu.com/s/1gdgKsMZ
|