我在使用 FileStream.Write 函数时遇到性能问题。
我有一个控制台应用程序,用于使用 StreamReader 对象从文件(~ 大小为 400 KB)中读取 Base64 字符串。我使用 Convert.FromBase64String 将此字符串转换为字节数组。然后,我使用 FileStream 对象将此字节数组写入文件。这里得到的字节数组长度为334991。
我测量了写入字节数组所花费的时间 - 结果大约是 0.116 秒。
只是为了好玩,我使用 ASCIIEncoding.GetBytes 函数从相同的 Base64 编码字符串中获取了字节数组(尽管我知道这不会给出正确的 DECODED 输出 - 我只是想尝试一下)。我使用 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 倍(使用 real 解码需要更多时间)。
使用Convert.FromBase64String 得到的字节数组长度小于使用ASCIIEncoding.GetBytes 函数得到的长度。
我想知道我正在尝试做的就是使用 FileStream 对象写入一堆字节。那么为什么在将字节数组写入磁盘时会有如此巨大的性能差异(w.r.t. 所花费的时间)?
还是我做错了什么?请指教。
最佳答案
对于初学者来说,DateTime 的分辨率较低(iirc 0.018 秒)。所以最好使用秒表类。
现在这并不能完全解释差异,但您可能会得到一些更好的数字。
关于c# - 写入使用 AsciiEncoding.GetBytes 和 Convert.FromBase64String 解码的字节时 FileStream.Write 中的性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/867211/