工程问题:为什么要重写ByteArray,并实现复杂的ByteUtil,而不用java自带的DataInputStream读取二进制数据呢?

最近在根据《自然语言处理入门》这本书看HanLP的源码,看到ICacheAble接口的两个方法,load方法的参数是ByteArray类型,为什么不和save方法一样用DataInputStream呢?还要设计ByteArray,并且在ByteUtil中实现复杂的字节转换? 为什么要这样设计呀?

书里面应该简单地提了一句,自己写的IO接口比Java层层封装的接口要快很多,冷启动很快。

开发1.x的时候可以说是毫秒必争,为了1ms的加速,不惜花很多精力去优化。当时Windows在机械磁盘上的读取速度很慢,ByteArray用尽量少的IO次数读取尽量多的block,然后自己解析数据流,速度优化很明显。当前,后面主要用macOS和Linux,有内存映射机制,对比就不明显了。

随着Python的兴起,人们接受了“过早优化是魔鬼”这种思潮,也就较少关注这么底层的优化了,也算是一种遗憾吧。

赞啊,非常感谢。