由于某种原因,我最近不得不记录写入文件所需的时间。我在 Azure VM 上的 Windows Server 2012 上完成了此操作。当我查看日志时,大多数时间是 0 毫秒,只有极少数是 15.s 左右。我以为我在测量中做错了什么,并用这段代码进行了测试:
class Program
{
static void Main(string[] args)
{
string dir = System.Environment.GetFolderPath(System.Environment.SpecialFolder.ApplicationData) + "\TEST";
if (!Directory.Exists(dir))
{
Directory.CreateDirectory(dir);
}
for (int i = 0; i < 10; i++)
{
DateTime start = DateTime.Now;
File.WriteAllText(dir + @"test.txt", "test");
DateTime end = DateTime.Now;
TimeSpan duration = end - start;
double ms = duration.TotalMilliseconds;
File.AppendAllText(dir+@"log.txt", Convert.ToString(ms) + System.Environment.NewLine);
}
}
}
在我的电脑上输出(操作系统区域设置设置为德语,所以逗号是小数点,而不是千位分隔符,使第一个数字为 5 毫秒):
5,0037 1,001 0,9976 1,001 1,001 2,002 0,9956 2,002 1,0003 0,9996
远程计算机上的输出:
0 0 0 0 0 0 0 0 0 0
有时(操作系统区域设置设置为英语,因此点是小数点,使相关数字为 15.5 毫秒):
0 0 0 0 0 0 15.4914 0 0 0
这是什么原因呢?这是Windows Server 2012或Azure VM上的一些写缓存吗?
附加信息:
- 我的电脑只有一个 SSD,远程计算机在单独的驱动器上配置了操作系统和数据(不确定是什么类型)
您在哪个驱动器上测试? 操作系统驱动器/临时驱动器/连接的驱动器...这很重要。正如您提到的,缓存设置也很重要,最好从连接的驱动器开始,没有缓存。
驱动器的 ALU 格式大小很重要。 例如,如果您将文件分块为 64kb 块,并且读取/写入速度为 64kb,则速度更快。
存储帐户上的 Azure 驱动器有 20 分钟的预热阶段,在该阶段中,它们可以"缓慢"单元化,或者在 20 分钟内不使用时。