Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何证明一个程序版本的内存效率更高?_C#_.net_Performance_Memory Management - Fatal编程技术网

C# 如何证明一个程序版本的内存效率更高?

C# 如何证明一个程序版本的内存效率更高?,c#,.net,performance,memory-management,C#,.net,Performance,Memory Management,我有一个需要处理数十万条记录的申请。现在,我一次只能处理500个。每批处理/分析最多需要5分钟(总共约10小时的处理时间)。限制500条记录的原因是内存消耗。我认为我们的程序占用如此多内存的一个主要原因是,我们没有设置列表或字典的大小(例如,new List()而不是new List(100000))。我更改了集合的大小,以便.NET停止创建和复制具有额外容量的新列表 我的问题是:如何证明一个版本的程序更节省内存?是否有性能计数器我应该查看?工具?监控?有这样的工具,您可以从中深入分析.net应

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

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

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

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


如果您有Visual Studio Ultimate:调试->启动性能分析,则可以使用内置性能分析器工具。如果你没有这个功能,你可以使用JetBrains,它可以完成同样的事情


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

我不认为探查器可以为您提供一个版本比另一个版本效率高多少的真实概述

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

首先,您应该只监视(当然是您的流程的)进程。您还可以添加进程的其余部分,只是为了查看整个虚拟内存状态在进程的生命周期内是如何变化的

如果有差异,你仍然不能得到一个好的概述和结论,你可以开始挖掘。不像我前面提到的那样容易分析,但要详细得多


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

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

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


至于名单;我认为设置列表的容量并不能解决您的问题。List类的容量增加了一倍(由于找不到文档,所以进行了测试)。最坏的情况是,您使用的内存是原来的两倍。如果创建的新列表不多,则可以创建对象缓存以重复使用列表。但以我的经验.NET这对.NET没有多大帮助,因为运行时相当高效

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

只要检查“总内存分配”和“在GC中花费的时间”就可以了解托管内存的使用方式

如果需要更多详细信息,请检查CLR分配勾选事件


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

您可以从查看GC周期数开始。Redgate有一个很好的探查器,可以很好地完成这项工作。更高效的版本需要不到10小时。同意。另一方面,如果您碰巧查看了内存评测,那么确实允许您记录性能计数器数据及其结果/快照。