我试图确定最坏情况下的磁盘速度,所以我写了下面的函数。如何在C#winform应用程序中执行非缓存文件写入
static public decimal MBytesPerSec(string volume)
{
string filename = volume + "\\writetest.tmp";
if (System.IO.File.Exists(filename))
System.IO.File.Delete(filename);
System.IO.StreamWriter file = new System.IO.StreamWriter(filename);
char[] data = new char[64000];
Stopwatch watch = new Stopwatch();
watch.Start();
int i = 0;
for (; i < 1000; i++)
{
file.Write(data);
if (watch.ElapsedMilliseconds > 2000)
{
break;
}
}
watch.Stop();
file.Close();
System.IO.File.Delete(volume + "\\test.txt");
decimal mbytessec = (i * 64/watch.ElapsedMilliseconds);
return mbytessec;
}
函数工作正常,但写入缓存,所以速度不是最坏的情况。
在WIN32 C++,我只想创建FILE_FLAG_NO_BUFFERING
,FILE_FLAG_WRITE_THROUGH
选项的文件,并确保遵循非缓存书写规则(写在扇区大小偏移文件,用4k最低写入)
我找到了一个讨论.NET技术的article。
所以我写了一个新的函数(忽略数学错误)。
static public decimal MBytesPerSecNonCached(string volume)
{
const FileOptions FILE_FLAG_NO_BUFFERING = (FileOptions)0x20000000;
string filename = volume + "\\writetest.tmp";
using (FileStream fs = new FileStream(filename, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None, 1024, FileOptions.WriteThrough | FILE_FLAG_NO_BUFFERING))
{
byte[] data = new byte[65535];
int i = 0;
Stopwatch watch = new Stopwatch();
watch.Start();
for (; i < 1000; i++)
{
fs.Write(data, 0, 65535);
if (watch.ElapsedMilliseconds > 2000)
{
break;
}
}
watch.Stop();
fs.Close();
System.IO.File.Delete(filename);
decimal mbytessec = (i * 64/watch.ElapsedMilliseconds);
return mbytessec;
}
}
此功能对于4K,16K和32K写大小,但一旦我尝试64K写大小,我得到一个异常:
IO operation will not work. Most likely the file will become too long or the handle was not opened to support synchronous IO operations.
所以,我怎么能解决这个问题,所以我可以测试大于32KB的写入大小(64KB到4096KB)?
.NET框架的开发旨在从开发人员那里删除这些决定,并允许框架管理“为您”。好消息是,99%的需求确实非常好。坏消息是,当你觉得你需要它的时候,它不想给你这种控制(或者只是简单地想要它)。这个解决方案,如果你热衷于这样做,那么'你的自我'就是使用PInvoke来解决Win32 dll的问题,然后就像你在C++中一样。 – 2011-05-06 21:23:54