Profiling:Dispose() 在 profiling 中拥有最独占的时间
Posted
技术标签:
【中文标题】Profiling:Dispose() 在 profiling 中拥有最独占的时间【英文标题】:Profiling: Dispose() has the most exclusive time in profiling 【发布时间】:2013-01-22 07:00:32 【问题描述】:我有一个使用 xsd 方案将数据导出为 xml 文件的应用程序。
它会创建很多小文件。 29Gb,其中文件的平均大小为 0.3MB 或 10KB。 它创建了大约 140000 个文件。它使用
Enumerable.Range(1, gs.Count)
.AsParallel()
.ForAll
将独立数据保存到文件
使用 MS Profiler,我将执行时间减少到 30 分钟。峰值写入速度高达 20Mb/s。
因此,***分析器结果的最终版本包含:
System.IO.File.Open(string,valuetype System.IO.FileMode) 30,14 %
System.IDisposable.Dispose() 22,09%
System.Xml.Serialization.XmlSerializer.Serialize(class System.IO.Stream,object) 13,42 %
代码是:
using (Stream streamw = File.Open(fileName, FileMode.Create))
formatter.Serialize(streamw, this);
格式化程序在哪里:
static XmlSerializer formatter = new XmlSerializer(typeof(XItemDesc));
所以问题是:
1) 分析器的结果是否意味着我已达到 HDD 性能的最大值?
2) 在第二行有 Dispose 是预期的行为吗?
【问题讨论】:
我并不特别感到惊讶 - 打开 140K 文件确实很多。你的代码真的太慢了吗?需要多长时间,您需要多长时间? @JonSkeet,由于使用并行库,它不会一次打开所有文件。我认为它并没有减慢,但我只想检查它是否是预期的行为。 profiler 表示,应用在这三种方法中花费的时间最多。 【参考方案1】:嗯,也许性能瓶颈是由 Parallel 造成的。请记住,对 HDD 的请求不是并行的,它们是排队的。
如果您的文件位于不同的位置、不同的网络共享或不同的物理硬盘驱动器上,您可以从 Parallel 获得性能提升。
另外,如果您使用的是 .NET 2.0,并且我看到您正在使用 using() 语法糖,您仍然应该调用 Dispose() 并取消对 Stream 的引用,因为 using() 是错误的。
如果文件所在的分区是NTFS,那么请考虑小文件NTFS的性能缺陷。 NTFS performance and large volumes of files and directories
【讨论】:
以上是关于Profiling:Dispose() 在 profiling 中拥有最独占的时间的主要内容,如果未能解决你的问题,请参考以下文章
在 Winforms 生成的 .Designer.cs 文件中修改 Dispose(bool) 时,是不是需要将 Dispose 移至主代码文件?