我有一个控制台应用程序,使用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编码字符串的文件进行了测试,使用 Convert.FromBase64String 函数获取的字节数组长度小于使用 ASCIIEncoding.GetBytes 函数获取的字节数组长度。在将这两种类型的字节数组写入文件时,时间差异几乎是10倍(使用真实解码写入字节数组的时间更长)。
我想知道,我所做的就是使用 FileStream 对象写入一堆字节,为什么在将字节数组写入磁盘时会有如此明显的性能差异(时间方面)?
或者我做错了什么吗?请给予建议。