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

时间:2015-11-07 20:22:02

标签: c# performance

我正在使用DotNetZip解压缩包含大量小文档(大约100,000个)的存档。我希望用户知道到目前为止取得了哪些进展,因此我在解压缩存档时打印了一个百分比信息。

现在,以下两个解决方案中的哪一个对性能表示赞赏?

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++;
}

2 个答案:

答案 0 :(得分:2)

使用秒表(System.Diagnostics)(https://msdn.microsoft.com/de-de/library/system.diagnostics.stopwatch%28v=vs.110%29.aspx)检查区别如下:

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 ,...
然后比较两个不同的代码。

答案 1 :(得分:1)

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

time_t timelast = time();
time_t timenow;

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

time()可能有点粗糙,因此您可以考虑更高分辨率的来源。您甚至可以完全消除i变量。通常,1秒间隔的进度输出足够好,并且通常不会对性能产生太大影响。