2

我有一个必须处理数十万条记录的应用程序。现在,我一次只能处理 500 个。每批最多可能需要 5 分钟来处理/分析(总共约 10 小时的处理时间)。限制 500 条记录的原因是内存消耗。我认为我们的程序占用这么多内存的主要原因之一是我们没有设置列表或字典的大小(例如 new List() 而不是 new List(100000))。我进行了更改以设置集合的大小,以便 .NET 停止创建和复制具有额外容量的新列表。

这是我的问题:如何证明某个版本的程序内存效率更高?是否有我应该查看的性能计数器?工具?监控?

4

5 回答 5

3

有像.net 内存分析器这样的工具,您可以从中深入分析 .net 应用程序的内存管理和内存泄漏。

.NET Memory Profiler 是一个强大的工具,用于查找内存泄漏并优化用 C#、VB.NET 或任何其他 .NET 语言编写的程序中的内存使用。在分析指南、自动内存分析器和专门的跟踪器的帮助下,您可以确保您的程序没有内存或资源泄漏,并且内存使用尽可能最佳。

于 2012-07-07T04:52:57.660 回答
2

我认为分析器不会让您真正了解一个版本比另一个版本的效率高多少。

我建议使用内存性能计数器来执行此操作。perfmon您可以使用, 为您的应用程序的两个版本设置一些数据收集会话。

您应该首先只监视进程内存(当然是您的进程的)。您还可以添加一些其余的系统内存性能计数器,以查看整个虚拟内存状态在您的进程生命周期内如何变化。

如果存在差异并且您仍然无法获得良好的概述和结论,您可以开始挖掘.NET CLR 内存性能计数器。不像我之前提到的那样容易分析,但更详细。

考虑到您的应用程序执行的处理时间很长,您可能应该将每个会话运行一两个小时以获得一些好的数据。

于 2012-07-07T06:51:57.073 回答
1

如果您有 Visual Studio Ultimate,则可以使用内置的 Performance Profiler 工具:Debug -> Start Performance Analysis。如果你没有这个可用的,你可以使用JetBrains 的dotTrace ,它可以完成同样的事情。

您还可以使用Stopwatch类来测量执行时间。与 DateTime.Now 相比,秒表专门设计用于测量经过的时间,并且可以(如果在您的硬件上可用)使用底层高频硬件计时器提供良好的粒度/准确性。通过使用 Stopwatch 类并比较两个执行时间,您可以看到哪个运行得更快。这不会提供任何有关 CPU 或内存使用情况的信息。

于 2012-07-07T06:43:34.400 回答
1

使用大量内存通常不会真正减慢您的速度,直到您用完实际内存并开始使用交换文件。您可以在应用程序运行时在任务管理器中进行检查。您还可以在其中查看应用程序的内存峰值和工作量。

我会稍微分析一下(有几个可用的内存分析器)以查看哪些对象占用了您的内存。

至于名单;我认为设置列表的容量不会解决您的问题。List 类通过使容量增加一倍而增长(经过测试,因为我找不到文档)。最坏的情况是您使用两倍的内存。如果您创建的新列表过多,您可以创建一个对象缓存来重新使用这些列表。但根据我的经验 .NET 这在 .NET 中没有多大帮助,因为运行时非常高效。

于 2012-07-08T08:46:32.490 回答
0

您可以使用 CLR GC ETL 事件。从 Microsoft 下载 perfview,在其下运​​行您的应用程序,然后只需检查 GC 页面。

只需检查“总内存分配”和“在 GC 中花费的时间”即可让您了解托管内存的使用方式。

如果您想了解更多详细信息,请检查 CLR 分配滴答事件。

Perfview 还可以分析您的托管堆活动对象。

于 2012-07-16T20:04:50.143 回答