本文共 1661 字,大约阅读时间需要 5 分钟。
一般来说,所有工程都会有对文件进行读写的操作。如果你不仅是要存储少量字节(例如JSON文件),就有必要考虑性能问题了。因为这种情况下很容易写出低效率的文件读写代码,而且编译器和Unity都无法帮助你优化。今天这篇文章将分享文件读写代码中一些常见的误区,希望对大家有所帮助。.NET API提供了很多完善的写入文件系统相关的类。Stream抽象类和其子类FileStream,还有File类,带有静态函数Open以及很方便的读写函数如BinaryReader和BinaryWriter。C#语言本身提供了using语法可以方便地关闭文件流、文件读写对象实例和文件句柄。这类代码使用便利,安全系数高,容易实现:
打开文件:File.Open
读取字节:stream.Read
写入字节:stream.Write
查询位置: stream.Position 或 stream.Seek
关闭文件:stream.Dispose 或 stream.Close
写入20MB,每次写入4KB的数据块
写入20MB,每次写入1字节
读取20MB,每次读取4KB的数据块
读取20MB,每次读取1字节
数次查找流的某个位置,次数与数据块的读写次数相同
数次打开某个文件,次数与数据块的读写次数相同
2.3 Ghz Intel Core i7-3615QM
Mac OS X 10.11.2
Apple SSD SM256E, HFS+ format
Unity 5.3.0f4, Mac OS X Standalone, x86_64, non-development
640×480, Fastest, Windowed
可以看出,以数据块的方式进行读写操作的效率非常之高。虽然你可能不会一个一个字节地去写,但却有可能以4字节(整数)或类似大小为数据块单位进行写入操作。所以尽可能以较大的数据块为单位进行操作,这将提高38倍的写入效率,205倍的读取效率!
流查找(不论设置Position或调用Seek)不会进行字节读写,但这种操作是有代价的,虽然没有其它类型的操作那样多,它需要相当于读取4KB数据块三分之一的资源。所以最好避免这种查找操作,尽量线性读写文件,这样才能在各层面最大限度地发挥缓存的优势。
最后,打开或关闭文件同样不需要读取任何字节,但需要的时间会很长。事实证明,非常之长!打开和关闭文件需要的时间是以字节块写入整个文件所需时间的6.5倍,是字节块方式读取整个文件所需时间的40倍。考虑到读写操作的重要性,以及打开和关闭文件是操作系统的唯一需求,所以,除非特别需要,不要打开关闭文件。而且操作大文件要比操作多个小文件更好。
转载:
本文来源于:jacksondunstan.com
原作者:Jackson Dunstan