c# - 写入使用 AsciiEncoding.GetBytes 和 Convert.FromBase64String 解码的字节时 FileStream.Write 中的性能问题

标签 c# .net encoding filestream decoding

我在使用 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/

相关文章:

c# - MVC4 将消息从一个 Controller 传递到另一个 Controller

C# - 测试期间出现奇数空引用异常,为什么会发生这种情况?

.net - 的确,对于长时间运行的进程,最好手动执行线程而不是线程池?

python - 更正 XML 编码

javascript - 如果<meta charset =“utf-8”>表示JavaScript使用的是utf-8编码而不是utf-16

从文本文件读取时的 Python 编码问题

c# - 在 C# 中,如何在不使用 Marshal 复制的情况下编写一个带有指向 FileStream 的 byte* 指针的数组?

.net - Appdomain 是沙箱 IronPython 的唯一方法吗?

c# - 是否可以在 Azure 上运行 .Net UWP 类库?

c# - 将数据透视项作为独立存储中的目录