C# 在C中通过回车符打印进度信息时,性能损失有多大?
我正在使用DotNetZip解包一个包含大量小文档(大约100000个)的归档文件。我想让用户知道到目前为止取得了什么进展,所以我在解压缩归档文件时打印了百分比信息 下面哪两种解决方案在性能方面值得赞赏 1:在每个第500项上打印输出,需要进行模运算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("\
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%。也许你的用户关心这个,也许他们不关心,我们不知道。你必须在现实的用户场景中做同样的实验。我们不知道那是什么,也不能告诉你。