C# 在C中通过回车符打印进度信息时,性能损失有多大?

C# 在C中通过回车符打印进度信息时,性能损失有多大?,c#,performance,C#,Performance,我正在使用DotNetZip解包一个包含大量小文档(大约100000个)的归档文件。我想让用户知道到目前为止取得了什么进展,所以我在解压缩归档文件时打印了百分比信息 下面哪两种解决方案在性能方面值得赞赏 1:在每个第500项上打印输出,需要进行模运算 double i = 0; double size = zip.Count foreach(ZipEntry element in zip) { if(i % 500 == 0) { Console.Write("\

我正在使用DotNetZip解包一个包含大量小文档(大约100000个)的归档文件。我想让用户知道到目前为止取得了什么进展,所以我在解压缩归档文件时打印了百分比信息

下面哪两种解决方案在性能方面值得赞赏

1:在每个第500项上打印输出,需要进行模运算

double i = 0;
double size = zip.Count
foreach(ZipEntry element in zip)
{
    if(i % 500 == 0)
    {
        Console.Write("\rInstalling "+ name +"... "+ (i/size)*100 +"%");
        Console.Out.Flush();
    }
    element.Extract(destinationPath, ExtractExistingFileAction.OverwriteSilently);
    i++;
}
2:打印每个项目的输出

double i = 0;
double size = zip.Count
foreach(ZipEntry element in zip)
{
    Console.Write("\rInstalling "+ name +"... "+ (i/size)*100 +"%");
    Console.Out.Flush();

    element.Extract(destinationPath, ExtractExistingFileAction.OverwriteSilently);
    i++;
}

使用秒表系统。诊断检查差异,如下所示:

Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();

double i = 0;
double size = zip.Count
foreach(ZipEntry element in zip)
{
    if(i % 500 == 0)
    {
        Console.Write("\rInstalling "+ name +"... "+ (i/size)*100 +"%");
        Console.Out.Flush();
    }
    element.Extract(destinationPath, ExtractExistingFileAction.OverwriteSilently);
    i++;
}

stopWatch.Stop();

MessageBox.Show(stopWatch.ElapsedTicks.ToString()); //Or milliseconds ,...

然后比较这两种不同的代码。

我以前做过类似的工作。我会添加一个时间变量。没有一点输出的进度比眼睛看到的要快。由于每个文件复制时间可能不同,请执行以下操作:

time_t timelast = time();
time_t timenow;

if ((i % 500) == 0) {
    timenow = time();
    if ((timenow - timelast) >= 1) {
        timelast = timenow;
        // do output
    }
}

时间可能有点粗糙,所以你可以考虑更高分辨率的源。甚至可以完全消除i变量。通常,以1秒为间隔的进度输出足够好,通常不会对性能产生太大影响。

为什么不尝试并测量每个选项?每次我看到性能问题时,我都觉得有必要让人们以用户的身份阅读这篇文章,我不会对控制台上的100.000条提示感到恼火,他们中的大多数人告诉我,自上次提示以来,这一进程一直没有进展。因此,与性能问题无关,只有当进度发生显著变化时,我才会提示,例如每10%。即使不提取zip文件,快速测试也会产生7.6秒的时间将100k消息写入控制台,2.3分钟的时间将100k文件写入控制台。所以我们说的差异最多只有5%。也许你的用户关心这个,也许他们不关心,我们不知道。你必须在现实的用户场景中做同样的实验。我们不知道那是什么,也不能告诉你。