写点什么

System.IO 的新特性和性能改进

  • 2009-10-15
  • 本文字数:860 字

    阅读完需:约 3 分钟

微软打算为核心的 System.IO 功能提供一些简单却极受欢迎的性能改进。包括读写文本文件的便捷方法,快速地列举目录,对内存映射文件的支持。

第一个改进是,替换 File.ReadAllLines 这个原有的便捷方法。对于小文件而言,这是一个很好用的函数,但随着文件大小增大就会出现问题。根本的缺陷在于,ReadAllLines 会暂停程序的运行直到整个文件都被读到字符串数组中。

替代的方法是 File.ReadLines,其返回一个字符串枚举器。这种用延迟模式来读取文件方式,犹如使用低级的流对象一样。也为 File.WriteAllLines 和 File.AppendAllLines 提供了新的重载,两者可以接受枚举器而非数组作为参数。

DirectoryInfo.GetFiles 具有同样的数组问题,不过它们还带来了更为严重的问题。在获取文件列表的时候,Win32 API 也同时会返回诸如大小和最后编辑日期这样的基本信息。不幸的是,这些信息被.NET 遗弃了,而由 FileInfo 对象来保存这些信息。所以,在程序开始遍历这些文件的时候,假设为了确定目录的总大小,就必须逐一重新查询文件系统。这就是一个经典的 1+N 优化问题。DirectoryInfo.GetFiles 和新的 DirectoryInfo.EnumerateFiles 都修复了这个问题。

另外一个针对.NET 的重要的性能改进是,对内存映射文件的支持。内存映射文件是把一块内存连接到一个文件的操作系统特性。一旦连接起来,你就能读写文件的任意部分,就像它已经不再是非托管内存数组了。操作系统会处理一些重要的细节问题,如把文件的不同部分分页到内存上,并在需要的时候从内存里提取出来。内存映射文件让应用程序可以操作非常庞大的文件,甚至上G 的文件也可高效地处理。

另外,对于底层文件I/O,内存映射文件提供了强大的方法来与进程通信。如果两个应用程序打开了同一个内存映射文件,那么某个应用程序做出的改变会立即反映给另外一个应用程序。

尽管名称如此,内存映射文件并不需要一个真正的文件。它们可以是一些纯粹的内存对象,只要不用于后备存储。在应用程序内,这个潜在好处,特别适合于解决跨进程通信的问题。

查看英文原文: New Features and Performance Improvements for System.IO

2009-10-15 02:301723
用户头像

发布了 254 篇内容, 共 56.7 次阅读, 收获喜欢 2 次。

关注

评论

发布
暂无评论
发现更多内容

Week 10 作业

黄立

“通证经济”实质是生产关系的变革

CECBC

通证经济

架构方法

raox

极客大学架构师训练营

iOS 项目避坑:多个分类中方法重复实现检测

iOSer

ios 项目管理 编程语言 iOS Document

清华大佬马士兵告诉你从阿里P5级一直学到P8架构师的成长路线+视频教程!

比伯

Java 编程 架构 面试 计算机

go-zero 如何扛住流量冲击(二)

万俊峰Kevin

microservice Go 语言

架构师训练营第 1 期 - 第十周作业

Todd-Lee

极客大学架构师训练营

数字时代,如何跟上互联网医院的建设潮?

CECBC

数字化医疗

精心整理MySQL基本使用(数据库的操作、数据类型、MySQL的常用命令)

ShenDu_Linux

c++ MySQL 程序员 数据类型

tcp/ip协议栈——epoll的内部实现原理

Linux服务器开发

后端 TCP/IP epoll 网络协议栈 服务器开发

区块链数字版权应用落地开发,区块链版权溯源解决方案

13530558032

区块链跨境溯源平台搭建,助力跨境电商防伪溯源

13530558032

EMAS 移动 DevOps 解决方案 —— Mobile DevOps

移动研发平台EMAS

阿里云 DevOps 运维 开发 emas

讲真,你知道Python咋来的吗?

华为云开发者联盟

Java Python 编程语言 C语言 代码

Python进阶——什么是上下文管理器?

Kaito

Python

架构师训练营第 10 周学习总结

netspecial

极客大学架构师训练营

我是如何在五年阿里面试官的连珠炮问下三面斩获Java岗offer,最后定级P6的呢?

Java~~~

学习工作即游戏:游戏化生存的现实物语

脑极体

WSL2:我在原生的Win10玩转Linux系统

梁桂钊

Redis面试受阻?阿里P8架构师整理出的核心笔记+实战+面试题+脑图送你

比伯

Java 编程 程序员 面试 计算机

数仓搬迁:从方法到实践,带你解决数据一致性对比

华为云开发者联盟

数据仓库 数据 存储 数据校验 搬迁

5G矿山,工业真金,以及智能体矿井

脑极体

我就不信2W字把源码拆的这么碎,你还不明白mybatis缓存

996小迁

Java 源码 架构 面试 mybatis

《具有算法和程序的离散数学基础》PDF免费下载

计算机与AI

算法 离散数学

一张图彻底理解Spring如何解决循环依赖!!

冰河

spring aop ioc 源码解析 循环依赖

五周 - 总结

水浴清风

深入浅出Spark

大数志

大数据 spark 数据科学

架构师训练营第 1 期 - 第十周总结

Todd-Lee

极客大学架构师训练营

跨国区块链投资 花式“割韭菜”骗光你的钱

CECBC

区块链

Week 1 学习总结

J

极客大学架构师训练营

白皮书丨关于工业互联网,你想知道的都在这儿

华为云开发者联盟

工业互联网 华为云 白皮书 ICT 智能

System.IO的新特性和性能改进_.NET_Jonathan Allen_InfoQ精选文章