2013-10-31 47 views
0

我最近不得不记录由于某种原因写入文件所需的时间。我在Azure虚拟机上的Windows Server 2012上执行了此操作。当我查看日志时,大部分时间都是0毫秒,只有极少数是15秒。我觉得我做了一件错误的测量和测试了这段代码:Windows Server 2012 Azure VM上的文件写入时间

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([email protected]"\log.txt", Convert.ToString(ms) + System.Environment.NewLine); 
     } 
    } 
} 

输出我的电脑上(OS区域设置为德语,因此逗号是小数点符号,而不是一个千位分隔符,使得第一数目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 

有时(OS区域设置为英语,所以点是十进制标记,使得相关的数15.5毫秒) :

0 0 0 0 0 0 15.4914 0 0 0 

这是什么原因?这是一些在Windows Server 2012或Azure VM上的写缓存吗?

附加信息:

  • 我的电脑是在单个SSD,远程机器上配置了操作系统和数据的独立驱动器(不知道是什么类型)
+0

PC中的逗号是否输出小数点分隔符,表示写入操作通常需要1秒钟,但最多需要5秒钟?这种产出似乎不太可能。 BTW 15.4914是定时器分辨率(每个TotalMilliseconds将是该值的倍数)。 –

+0

要添加到Eric的评论我建议使用System.Diagnostics.Stopwatch而不是日期时间。它更准确。 http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx – MikeWo

+0

是PC输出中的逗号是小数点分隔符(OS语言环境是德语),数字是毫秒。由于文件创建,第一个值(5毫秒)更高。 1-2毫秒的写作似乎不太可能?或者只是几秒钟?感谢您使用Stopwatch的建议,不知道这一点。 – phlow

回答

0

你是什么驱动器测试这个呢? OS驱动器/临时驱动器/连接驱动器...重要。正如你所提到的,缓存设置也很重要,最好从连接的驱动器开始并且不要缓存。

驱动器的ALU格式大小很重要。例如,如果你将文件分成64kb的块并且有64kb的读/写速度更快。

存储帐户上的Azure驱动器有20分钟的预热阶段,它们可以“慢”单位化或20分钟不使用。

+0

PC驱动器是一个SSD,其中的操作系统,程序和数据都在该驱动器上。在Azure上,有一个用于操作系统和程序的持久分区和一个数据分区,在每次重启时都会被刷新(我认为)。我将该文件写入用户的AppData文件夹,该文件夹位于与OS相同的分区中。使用ALU格式大小意味着群集大小?在我的电脑和Azure虚拟机上,每集群也有4096字节。关于预热阶段:Azure上的文件写入持续时间为0毫秒,而我的PC为1-2毫秒,所以这不是问题。我想知道0毫秒。 – phlow

+0

这是一个链接,说写入文本后调用Flush,否则它将在磁盘缓存(内存)中:http://blogs.msdn.com/b/windowsazure/archive/2012/06/28/data -series-exploring-windows-azure-drives-disks-and-images.aspx这可能不是问题,因为你的代码使用了File类,我认为它会自动刷新......你可能想试着重复你的测试大文件覆盖磁盘缓存并查看您获得的数字。 –

相关问题