में गैर-कैश फ़ाइल कैसे लिखती है मैं सबसे खराब केस डिस्क गति निर्धारित करने की कोशिश कर रहा हूं, इसलिए मैंने निम्न कार्य लिखा।सी # 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 सी ++ में, मैं बस FILE_FLAG_NO_BUFFERING
, FILE_FLAG_WRITE_THROUGH
विकल्पों के साथ फ़ाइल बना सकेगी, और फिर गैर-कैश लेखन नियम (क्षेत्र आकार ऑफसेट पर फ़ाइल पर लिखने, 4k की न्यूनतम के साथ लिखते हैं)
मुझे एक article मिला जो .NET तकनीक पर चर्चा करता है।
इसलिए मैंने एक नया फ़ंक्शन लिखा (गणित त्रुटियों को अनदेखा करें)।
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.
तो, मैं इसे ठीक कर सकते हैं तो मैं परीक्षण कर सकते हैं 32 केबी से अधिक लिखने के आकार के साथ (64 केबी से 4096 केबी)?
डेवलपर से उन निर्णयों को हटाने के लिए .NET ढांचा विकसित किया गया था और ढांचे को "आपके लिए" प्रबंधित करने की अनुमति दी गई थी। अच्छी खबर यह है कि 99% जरूरतों के लिए यह वास्तव में बहुत अच्छा है। बुरी खबर, यह आपको उस नियंत्रण को नहीं देना चाहती जब आपको लगता है कि आपको इसकी आवश्यकता है (_ या सिर्फ सादा इसे चाहिए)। समाधान, यदि आप इसे 'स्वयं' करने पर उत्सुक हैं, तो Win32 dlls को संबोधित करने के लिए PInvoke का उपयोग करना है और फिर उसी तरह से करें जैसा आप C++ में करेंगे। –