我在使用 FileStream.Write 函数时遇到了性能问题。
我有一个控制台应用程序,用于使用 StreamReader 对象从文件中读取 Base64 字符串(~ 大小为 400 KB)。我使用 Convert.FromBase64String 将此字符串转换为字节数组。然后我使用 FileStream 对象将此字节数组写入文件。这里得到的字节数组长度为 334991。
我测量了写入字节数组的时间——结果大约是0.116 秒。
只是为了好玩,我使用 ASCIIEncoding.GetBytes 函数从同一个 Base64 编码字符串中获取了字节数组(尽管我知道这不会给出正确的解码输出 - 我只是想尝试一下)。我使用 FileStream 对象将此字节数组写入文件。这里得到的字节数组长度为 458414。
我用这种方法测量了写入字节数组的时间——结果大约是0.008 秒。
这是示例代码:
class Program
{
static void Main(string[] args)
{
Stopwatch stopWatch = new Stopwatch();
TimeSpan executionTime;
StreamReader sr = new StreamReader("foo.txt");
string sampleString = sr.ReadToEnd();
sr.Close();
////1. Convert to bytes using Base64 Decoder (The real output!)
//byte[] binaryData = Convert.FromBase64String(sampleString);
//2. Convert to bytes using AsciiEncoding (Just for Fun!)
byte[] binaryData = new System.Text.ASCIIEncoding().GetBytes(sampleString);
Console.WriteLine("Byte Length: " + binaryData.Length);
stopWatch.Start();
FileStream fs = new FileStream("bar.txt", FileMode.Create, FileAccess.Write);
fs.Write(binaryData, 0, binaryData.Length);
fs.Flush();
fs.Close();
stopWatch.Stop();
executionTime = stopWatch.Elapsed;
Console.WriteLine("FileStream Write - Total Execution Time: " + executionTime.TotalSeconds.ToString());
Console.Read();
}
}
我对大约 5000 个包含 Base64 编码字符串的文件进行了测试,写入这两种类型的字节数组所需的时间差几乎是 10 倍(使用 真实解码写入字节数组的时间更长)。
使用 Convert.FromBase64String 获得的字节数组的长度小于使用 ASCIIEncoding.GetBytes 函数获得的长度。
我想知道我要做的就是使用 FileStream 对象写入一堆字节。那么,为什么在将字节数组写入磁盘时会有如此巨大的性能差异(所需时间)?
还是我做错了什么?请指教。