在写项目或框架时,经常会遇到读取资源文件的情况,下边将会从三个方向来讨论不同的加载方式对性能(CPU、内存、磁盘IO以及网络IO)的影响:
资源文件的加载方式有:文件(File)加载、字节流加载、字符流加载、URL资源
性能指标:CPU、内存、磁盘IO、网络IO,及时性(频繁读取,一般是静态加载)
以Java为例,可以用File对象加载,InputStream加载,Reader加载等,那么用上边五种不同的加载方式,在计算机各个性能指标上有什么样的表现差异呢?
希望有深入研究过的朋友能来讨论讨论,大家一起学习学习。
----------------------割------------了----------------------
以及资源的大小边界对最优读写性能的影响,常见的场景有加载配置文件、记录日志、解析日志等等。
---------再割------------
有些回答问题的朋友让我哭笑不得
InputStream不过是File的一个变种吧?只不过是一个使用现成的Stream,一个还需要多一道打开程序(File->Stream)的过程而已,这点过程,怎么说呢,用InputStream,可能你用完不需要关闭,而File是需要关闭的(因为是你打开的),所以他们之间不存在IO性能对比。
Reader是一个封装了InputStream的对象,性能说起来是不如InputStream的,因为多了一层封装,当然,也或许在Reader里有一些优化的Cache机制,但作为顺序读取来说,这个Cache反而是累赘。Reader的价值应该是给应用提供了更简洁的读取Stream的手段而不是为了提升Stream的性能。
如1楼所言,IO这个东东,你是永远都绕不开的,除非是你自己写的程序里滥用和乱用Stream,否则,在Stream层次而言,你所谓的性能指标是不存在可比性,影响的因素太多,而排除这些影响因素后,三者之间,Reader无疑是最差的(当然,这个差也是极其有限的)。
你在纠结些无用的事情,因为磁盘IO总的来说不是你管的,是操作系统的事情,
你能做的就是使用操作系统提供的文件系统使用资源,结论是,这些东西是文件系统决定的,不是代码能决定,
代码能决定的是怎么使用。至于怎么使用,那就是该用什么就用什么。。
楼主是一个负责人类探索外星项目的负责人,整个软件项目造价3万万亿,每一点微弱的性能提升可以为人类节省几千亿的经费。鉴定完成。
我只是想多了解点而已,呵呵
其实很多时候读取资源文件,都是使用异步线程的方式,然后使用回调,性能的瓶颈在线程执行时间的长久(线程数有限),所以基本上会使用线程池线程,将瓶颈交给IO线程,自己立即返回,这样能提高性能和并发量