一次通过后文件复制速度更快

时间:2013-07-10 08:37:18

标签: c# .net file .net-3.5 copy

我有一个程序可以将大量文件从几个目录复制到目录。金额未知(约50K),但它们都在同一个驱动器上。在程序中应该有一个进度条。当我第一次写程序时,我没有写进度条,程序运行缓慢。我大约需要15-20分钟来传递文件。为了写入进度条我需要知道我有多少文件,所以我浏览了目录并列出了文件。现在第一次浏览文件需要大约5分钟,但副本只需要5-7分钟。

任何人都可以解释这种现象吗?很抱歉,我无法分享代码,但它只是简单使用File.Copy和简单的c#.net 3.5 progressBar

2 个答案:

答案 0 :(得分:4)

这种方法可以最大限度地减少磁盘驱动器上最昂贵的操作,移动读取器头。磁盘速度由两个基本机械约束评定。一个是盘片旋转的速度,它设定了数据传输速度的上限。这是固定的。读头可以多快地移动到另一个轨道。寻道时间,通过一条轨道移动十几毫秒是典型的。在cpu周期中很长一段时间。这使得访问磁盘数据的 order 非常重要。像你原来那样在目录记录和文件数据集群之间不断地来回读取读者头是非常昂贵的。

磁盘上的数据碎片的程度也非常重要,这是碎片整理实用程序存在的原因。看到高速文件被创建和删除的驱动器往往会更快碎片化。碎片率越高,您需要从驱动器读取数据的磁盘越多。

首先阅读目录条目,可以避免大量搜索。它们位于称为MFT的驱动器区域中,在物理上彼此靠近,因此长期搜索的次数较少。当你真正开始复制文件时,你会再次阅读它们,但这次它们来自文件系统缓存。第一次扫描目录时存储在RAM中。所以不需要昂贵的寻求MFT。

另外值得注意的是SSD之所以比机械驱动器工作得更好,它们的寻道时间非常短。

答案 1 :(得分:0)

这不是一种现象,而是Caching