c# 多线程内存使用 - 应用程序变慢和 CPU 使用率下降

标签 c# multithreading performance cpu-usage garbage-collection

我有一个多线程应用程序可以处理内存中的数据(无需数据库或网络访问)。我在两台机器上试过,一台机器是 Xeon 双四核 CPU,另一台是双核。生成了 5 个线程。

然后这个多线程进程启动并运行得非常快,5 核的 CPU 使用率为 60%,物理内存为 RAM 容量的 50%。 (来自任务管理器的信息)。在完成大约 1/3 后,它开始变慢,CPU 利用率降至略低于 20%。当它到达 2/3 秒的时候,速度太慢了,完成最后三分之一需要 1 天,而完成前 1/3 需要半小时。

该进程创建了许多 SortedLists 和 Lists,所以我开始怀疑垃圾收集器无法应对,尽管任务管理器内存使用情况还不错……我想尝试强制 GC 释放立即收集未使用的收藏品,这是合理的还是可行的?为什么 CPU 使用率会下降?

最佳答案

强制垃圾收集器运行几乎总是一个坏主意。 (在某些情况下,强制它提前运行实际上可以延长对象的生命周期)

下载类似 Memprofiler 的工具, AntsdotTrace (他们都有试用版),以识别您是否正在泄漏内存。您是否正在分配大于 85Kb 的对象?

另外,您使用的是什么版本的操作系统和 .NET Framework? (GC 的服务器和 PC 版本的工作方式有所不同)

此外,请注意插入到 SortedList 的复杂度为 O(N)(而插入 SortedDictionary 的复杂度为 O(logN):

The SortedList generic class is a binary search tree with O(log n) retrieval, where n is the number of elements in the dictionary. In this, it is similar to the SortedDictionary generic class. The two classes have similar object models, and both have O(log n) retrieval. Where the two classes differ is in memory use and speed of insertion and removal:

  • SortedList uses less memory than SortedDictionary.

  • SortedDictionary has faster insertion and removal operations for unsorted data, O(log n) as opposed to O(n) for SortedList.

  • If the list is populated all at once from sorted data, SortedList is faster than SortedDictionary.

Ref .

您如何管理对这些列表的多线程访问?你能发布一些削减代码吗?

关于c# 多线程内存使用 - 应用程序变慢和 CPU 使用率下降,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3689207/

相关文章:

c# - 使用证书保护 IIS 中的 WCF 服务

c# - 更新 PropertyGrid

java - 这个java类线程安全吗?

java - 查找 JVM 中上下文切换或唤醒线程所花费的 CPU 时间

javascript - 具有多值性能的 React Context API

c# - 更高效的数据包序列化

c++ - 使用 Boost 的 C++ 中的多线程之谜

显示大文件的 JavaFX textarea

performance - 与 RavenDB 相比,使用 MSMQ 作为 Nservicebus 的订阅存储时吞吐量有很大差异

c# - 创建动态变量名