我正在使用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++;
}
答案 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秒间隔的进度输出足够好,并且通常不会对性能产生太大影响。