我用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);

解决方案 »

  1.   

    可能是加载到内存后,直接从起始地址顺序读取到结束地址(由于内存碎片的问题,可能会有多个散列的内存块,但在系统看来,仍然相当于一个整体)
    for循环里的每次都会allocate-deallocate频繁读写
      

  2.   

    加载到内存?那怎么会这么快呢?硬盘读写速度最大也是150M/s的。
    另外:for循环是这样
    for(int i=0;i<fs.length;i++)
    {
       a[i]=b[i]^a[i]
    }
      

  3.   

    也是,难道用了文件指针?并没有实际载入到内存里,而是等到实际使用的再去buffer读取?
    反射了一下它的代码,只看到它用到了一个私有方法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);
      

  4.   

    你这只是打开,还没开始读呢...怎么可能100ms...for里面那才开始从磁盘读...你的另一个帖给你回了...先尽量多的读到内存中再做处理...
      

  5.   

    想来也是,不然照那样,光操作系统要用到的文件都不够内存装的搜到一点关于文件操作:
    在使用内存映射文件进行I/O处理时,系统对数据的传输按页面来进行。至于内部的所有内存页面则是由虚拟内存管理器来负责管理,由其来决定内存页面何时被分页到磁盘,哪些页面应该被释放以便为其它进程提供空闲空间,以及每个进程可以拥有超出实际分配物理内存之外的多少个页面空间等等。由于虚拟内存管理器是以一种统一的方式来处理所有磁盘I/O的(以页面为单位对内存数据进行读写),因此这种优化使其有能力以足够快的速度来处理内存操作。  使用内存映射文件时所进行的任何实际I/O交互都是在内存中进行并以标准的内存地址形式来访问。磁盘的周期性分页也是由操作系统在后台隐蔽实现的,对应用程序而言是完全透明的。内存映射文件的这种特性在进行大文件的磁盘事务操作时将获得很高的效益。
      

  6.   

    回复于:2011-07-19 21:20:59你这只是打开,还没开始读呢...怎么可能100ms...for里面那才开始从磁盘读...
    你的另一个帖给你回了...先尽量多的读到内存中再做处理... 还没读?那我应该怎么计算读取文件的时间呢?