使用 StreamWriter:写一个大字符串或许多小片段哪个更快?

问题描述

我正在用 C# 生成一个 HTML 输出文件,尽管 60 Mb 文件的速度性能似乎不可能很长。生成文件需要20分钟,这是一个非常缓慢的过程。以前大约 35 Mb,它是在 5 秒内生成的,所以我不确定是什么导致了这里的延迟。

首先,我将使用这些行开始生成报告:

  public static void GenerateHtmlReport()
        {
            GenerateFinalResults();
            HtmlFileName ??= "Report-" + $"{DateTime.Now:dd_MMM_yyyy-[HH_mm]}" + ".html";
            var fileName = Path.Combine(GetRootFolder(),HtmlFileName);
            using var fs = new FileStream(fileName,FileMode.Create);
            using var w = new StreamWriter(fs,Encoding.UTF8);
            w.WriteLine(RenderHtml.ContructReportHeader(User));
            RenderHtml.ConstructHtmlBody(Results,w);
            w.WriteLine(RenderHtml.ConstructFullSummaryReport(Results));
            w.WriteLine(RenderHtml.ContructDashboard(Results,ResultStart));
        }

如果我要写入文件的完整字符串,则需要相当长的时间,但是我认为逐条写入并没有多大帮助。

虽然这让我想到了两个问题

  1. 哪个过程会更快,写整个字符串还是小片段?
  2. 我应该使用不同的文件写入方法来提高性能吗?

问候,

解决方法

答案确实是 StringBuilder。修改代码的所有部分,而不是使用 +(连接),我起诉 StringBuilder.Append() 并将其作为字符串返回。现在创建报告的时间不到 5 秒,而不是 22 分钟。所以这是一个巨大的改进。