代码在生产服务器上工作得慢得多

时间:2016-06-30 12:40:15

标签: c# performance iis

我有一些非常基本的遗留代码。代码从ZIP文件中提取文件,将ZIP中的文件内容从XML反序列化为对象,并对该对象执行某些操作。

Zip文件大约是90mb。问题在于,此代码在本地计算机上执行大约3秒(提取1.5秒,并在1.3秒内反序列化所有文件),但是当我在Windows服务器和IIS 6.1上发布该代码时,大约需要28秒与同一文件相同的操作。 14秒提取和13秒反序列化。

服务器是VPS,8核,16GB RAM。

有没有人有任何想法?

 public List<FileNameStream> UnzipFilesTest(List<string> files, string zippedPathAndFile)
        {
            //var result = new Dictionary<string, MemoryStream>();
            var unzipedFiles = new List<FileNameStream>();
            string file1 = System.Web.Hosting.HostingEnvironment.MapPath(zippedPathAndFile);


            if (File.Exists(file1))
            {

                using (MemoryStream data = new MemoryStream())
                {

                    using (Ionic.Zip.ZipFile zipFile = Ionic.Zip.ZipFile.Read(file1))
                    {
                        zipFile.ParallelDeflateThreshold = -1;
                        foreach (ZipEntry e in zipFile)
                        {

                            if (files.Contains(e.FileName, StringComparer.OrdinalIgnoreCase))
                            {

                                e.Extract(data);

                                unzipedFiles.Add(new FileNameStream() { FileContent = Encoding.UTF8.GetString(fs..ToArray()), FileName = e.FileName }); //(e.FileName, data);

                            }
                        }
                    }
                }
            }


            return unzipedFiles;
        }

2 个答案:

答案 0 :(得分:2)

使用Parallel.Foreach循环优化foreach循环将安排使用多个线程解压缩文件的工作。线程越多,它就越快。我并不是说它不是服务器上的硬件,网络,防火墙或防病毒问题 - 但是硬件问题并不是明智之举。

这可能是有用的MSDN Link

您的代码看起来像:

Parallel.ForEach(zipEntires, (e) =>
{
   if (files.Contains(e.FileName, StringComparer.OrdinalIgnoreCase))
   {
      e.Extract(data);
      unzipedFiles.Add(new FileNameStream() { FileContent = Encoding.UTF8.GetString(fs..ToArray()), FileName = e.FileName }); //(e.FileName, data);
   }
}

答案 1 :(得分:0)

这是VPS本身的一部分。经过7天的研究,主机提供商工作人员提出要迁移到新机器,现在一切似乎都井井有条。