IO性能问题之滥用缓冲和过度同步

中文译文
英文原文

1. 错误地使用缓冲

1.1 错误一

为内存IO类添加Buffer。ByteArrayInput/OutputStream等为内存IO类,不会访问任务IO设备(磁盘、网络等)。所以对它们添加buffer是完全没有必要的。

1.2 错误二

重复添加Buffer。多于一次的Buffer只会引入更多的栈调用和垃圾创建

1.3 错误三

不理解JDK中Buffered版本的IO类跟显示使用Buffer的区别。从本质上讲,这两种做法是要达到相同的目的,但方法不同,这也导致了它们之间具有巨大的性能差异。测试数据显示JDK中Buffered版本的IO类比显示使用Buffer的IO类性能要差很多。

原因如下 1.JDK中Buffered版本的IO类导致很多无谓的栈调用(JDK大量使用装饰者模式)
2.JDK中所有的Buffered版本的IO类都是线程安全的。

2. 过度地同步保护

具体指的是JDK的IO包,也就是java.io包。随便看看java.io包中的两个类,果然大量的同步方法

所以只要你使用JDK的IO包,你就被迫的添加了许多同步保护,即使你完全确定你的代码运行在单一线程的环境下,你也不能回避这些不必要的保护。你也许会好奇的问,这真的是一个严重的问题吗?JVM在运行时会对弱竞争的锁进行优化,不是吗?不过它做的优化还远远不够。

上图显示了JDK IO类和 Unsyc版的IO类在读取内存数据(In-memory data)时的性能差异

上图显示了JDK IO类和 Unsyc版的IO类在写入内存数据(In-memory data)时的性能差异

注意:采用内存数据而不是磁盘数据是为了放大同步操作对整体性能的影响,以便于分析

3. 总结

可见同步保护是一项多么沉重的操作。我们日常开发中存在大量局限在方法调用栈内的IO类使用,这些情况都是绝对发生在单一线程环境下的。另外一些时候,即使IO对象的引用超出了方法调用栈的作用域,但我们可以通过分析得知它仍然只会被单一线程所访问

也可以试用一下非同步的UnsycIO

转载于:https://my.oschina.net/apm/blog/182850

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值