我有一个必须处理数十万条记录的应用程序。现在,我一次只能处理500个。每批可能需要5分钟来处理/分析(总共约10小时的处理)。限制500条记录的原因是内存消耗。我认为我们的程序占用大量内存的主要原因之一是我们没有设置列表或字典的大小(例如新的List()而不是新的List(100000))。我做了更改以设置集合的大小,以便.NET停止创建和复制具有额外容量的新列表。
这是我的问题:如何证明某个程序版本的内存效率更高?我应该看一下性能指标吗?工具?监测?
答案 0 :(得分:3)
有.net memory profiler之类的工具,您可以从中深入分析内存管理和.net应用程序的内存泄漏。
.NET Memory Profiler是一个功能强大的工具,用于查找内存泄漏并优化用C#,VB.NET或任何其他.NET语言编写的程序中的内存使用情况。在分析指南,自动内存分析器和专用跟踪器的帮助下,您可以确保程序没有内存或资源泄漏,并且内存使用情况尽可能最佳。
答案 1 :(得分:2)
我认为分析器不会让您真实地了解一个版本比另一个版本更有效。
我建议使用内存性能计数器来执行此操作。您可以使用perfmon
为您的两个应用版本设置一些数据收集会话。
您应该首先监控process memory(当然是您的流程)。您还可以添加system memory performance counters的其余部分内容,以了解整个虚拟内存状态在流程生命周期中的变化情况。
如果存在差异而您仍然无法获得良好的概述和结论,那么您可以开始挖掘.NET CLR memory performance counters。不像我之前提到的那样容易分析,但更详细。
考虑到您的应用程序进行了漫长的处理,您应该运行每个会话一两个小时以获得一些好的数据。
答案 2 :(得分:1)
如果您有Visual Studio Ultimate,则可以使用内置的Performance Profiler工具:调试 - >开始绩效分析。如果你没有这个,你可以使用JetBrains的dotTrace,它可以完成同样的事情。
您还可以使用Stopwatch类来衡量执行时间。秒表专门用于测量经过的时间,与DateTime.Now相比,使用底层高频硬件定时器可以(如果在硬件上可用)提供良好的粒度/准确度。通过使用Stopwatch类并比较两个执行时间,您可以看到哪个运行得更快。这不会提供CPU或内存使用情况的任何信息。
答案 3 :(得分:1)
使用大量内存通常不会让你失望,直到你离开真正的内存并开始使用swapfiles。您可以在应用程序运行时在任务管理器中检查它。您还可以在其中查看应用内存的峰值和工作量。
我会介绍一下(有几个可用的内存分析器)来查看占用内存的对象。
关于名单;我认为设置列表的容量不会解决您的问题。 List类通过将容量加倍来增长(经过测试,因为我找不到文档)。最坏的情况是你使用两倍的内存。如果您创建了新的列表,则可以创建一个对象缓存来重用列表。但根据我的经验,.NET在.NET中没有多大帮助,因为运行时非常有效。
答案 4 :(得分:0)
您可以使用CLR GC ETL事件。从Microsoft下载perfview,在其下运行您的应用程序,然后只需检查GC页面。
只需检查“总内存分配”和“在GC中花费的时间”就可以了解如何使用托管内存。
如果您想了解更多详情,请查看CLR分配标记事件。
Perfview还可以分析您的托管堆实时对象。