我用fileStream 读取一个文件100M的文件,速度100ms左右?有这么快吗?我同样做一个100M次的for循环,里面是两个字节的异或操作(a[i]=b[i]^a[i]),反而比读这么大的文件还慢。代码:
FileStream fs = new FileStream(@"c:\a.data",FileMode.Open);\\a.data 大小为100Mint size=(int)fs.Length;
byte[] a =new byte[size];Stopwatch sw = new Stopwatch();
sw.start();
fs.Read(a,0,size);
sw.stop();Console.WriteLine("{0}",sw.ElapsedMilliseconds);
FileStream fs = new FileStream(@"c:\a.data",FileMode.Open);\\a.data 大小为100Mint size=(int)fs.Length;
byte[] a =new byte[size];Stopwatch sw = new Stopwatch();
sw.start();
fs.Read(a,0,size);
sw.stop();Console.WriteLine("{0}",sw.ElapsedMilliseconds);
for循环里的每次都会allocate-deallocate频繁读写
另外:for循环是这样
for(int i=0;i<fs.length;i++)
{
a[i]=b[i]^a[i]
}
反射了一下它的代码,只看到它用到了一个私有方法ReadCore,而这个方法里面用到了Win32Native.ReadFile(引用自kernel32.dll)
以下FileStream Read()的一部分,IL小白,所以没贴那个了 if (!this.CanSeek || (count >= this._bufferSize))
{
num = this.ReadCore(array, offset, count);
this._readPos = 0;
this._readLen = 0;
return num;
}然后ReadCore方法里用到了异步线程并且调用了
Win32Native.ReadFile(handle, numRef + offset, count, IntPtr.Zero, overlapped);
在使用内存映射文件进行I/O处理时,系统对数据的传输按页面来进行。至于内部的所有内存页面则是由虚拟内存管理器来负责管理,由其来决定内存页面何时被分页到磁盘,哪些页面应该被释放以便为其它进程提供空闲空间,以及每个进程可以拥有超出实际分配物理内存之外的多少个页面空间等等。由于虚拟内存管理器是以一种统一的方式来处理所有磁盘I/O的(以页面为单位对内存数据进行读写),因此这种优化使其有能力以足够快的速度来处理内存操作。 使用内存映射文件时所进行的任何实际I/O交互都是在内存中进行并以标准的内存地址形式来访问。磁盘的周期性分页也是由操作系统在后台隐蔽实现的,对应用程序而言是完全透明的。内存映射文件的这种特性在进行大文件的磁盘事务操作时将获得很高的效益。
你的另一个帖给你回了...先尽量多的读到内存中再做处理... 还没读?那我应该怎么计算读取文件的时间呢?