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 中拥有最独占的时间的主要内容,如果未能解决你的问题,请参考以下文章

什么是profiling

如何使用gprof对软件做profiling

在 Winforms 生成的 .Designer.cs 文件中修改 Dispose(bool) 时,是不是需要将 Dispose 移至主代码文件?

Dispose() 用于清理托管资源?

垃圾收集器是不是调用 Dispose()? [复制]

在 Flutter 中,方法 'dispose' 被调用为 null