【问题标题】:Thread increases processor usage gradually线程逐渐增加处理器使用率
【发布时间】:2012-11-13 04:27:07
【问题描述】:

我有一个分配给核心 #7 的 .NET 线程。线程函数每 300ms 触发一次。最初执行一个调用大约需要 20-30 毫秒。但是这个时间会逐渐增加,经过大约 2,52,000 次调用后会超过 150 毫秒。

我还注意到核心#7 的使用率从 10% 开始。到线程函数的调用次数达到 2,52,000 核心 #7 的处理器使用率大约为 60%。当我停止触发线程函数时,处理器使用率变为 0%。但是当我再次开始触发时,核心使用率从 60%(不是从 0%)开始,然后逐渐增加。

我还注意到应用程序没有内存泄漏。

在我的线程函数中,我将两个字典的元素组合在一起,并将其添加到 foreach 循环中的另一个字典中。字典中的元素数将始终为 45。

我希望这个应用程序 24/7 全天候运行。请告诉我一些使该处理器使用率保持不变的提示。

【问题讨论】:

  • 您说,“字典中的元素数将始终为 45。”这是三个字典中每个元素的数量吗?你确定没有一本字典在增长吗?在我看来,这听起来像是一个使用未正确实现 GetHashCode 的自定义键类型的字典。
  • 谢谢 Jim Mischel,不。组合字典的最大计数为 45。一旦达到 45,它将被清除。另外两个字典的最大计数永远不会超过 10。我的字典被声明为 @987654322 @
  • 那么你必须展示一些代码。线程库不太可能导致 CPU 使用率增加。更有可能是您的代码中的某些内容。
  • 请展示一些源代码...否则很难给出任何具体答案...
  • 没有一些代码就无法提供帮助...

标签: c# multithreading multicore sorteddictionary


【解决方案1】:

当您将项目添加到 Dictionary 时,可能需要增加容量。你的字典会永远增长吗?

来自MSDN

如果 Count 小于容量,则此方法接近 O(1) 操作。如果必须增加容量以容纳新元素,则此方法变为 O(n) 操作,其中 n 为 Count。

【讨论】:

  • 感谢 Jonathon Reinhart,我的字典大小永远不会超过 45。
猜你喜欢
  • 2013-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-11
  • 2016-08-20
相关资源
最近更新 更多