【问题标题】:Performance degradation after solution upgrade from .net 4 to 4.6.1解决方案从 .net 4 升级到 4.6.1 后性能下降
【发布时间】:2023-03-24 03:10:02
【问题描述】:

我已将我的解决方案从 .net 4.0 升级到 .net 4.6.1 并观察到一些奇怪的行为。

我有一个程序,在这个程序中我有一个序列(称为 sequence1),它读取双精度数组的二进制文件并将数据保存在 RAM 中。

在升级之前,每当我运行这个 sequence1(程序是单线程的)时,机器使用了 25% 的 CPU(在 4 核机器中)。 自升级以来,这种行为发生了变化,如果我用 sequence1 启动我的程序,我会得到正常的行为(序列以 25% 运行)但如果在 sequence1 之前我运行了一些可以做的事情算术计算和分配一些类让我们称之为 sequence0,然后当我到达 sequence1 时,它会占用 70-90% 的 CPU。

我认为这可能与垃圾收集机制有关。我尝试将所有类设置为 null 并在 sequence0 之后(在调用 sequence1 之前)调用 GC.Collect,但我仍然得到 sequence1以 70-90% 运行;也许这与在执行 sequence0 时更新其阈值的 GC 算法有关?

【问题讨论】:

  • 也许gcConcurrent 现在处于活动状态?您可以使用 app.config 文件中的行为。主要问题是,现在更快了吗?也可能是 PGO(请参阅我的主要问题之一)。
  • 您需要分析应用程序的性能,而不是猜测问题。首先,您应该查看 .NET 的性能计数器,并将两次运行与这些计数器进行比较,看看有什么不同。
  • @Paolo,我会尝试 perfmon 并进行比较,但即使没有比较,单线程程序也不应该超过 25%(更不用说 90%),不是吗?

标签: c# .net performance garbage-collection .net-4.6.1


【解决方案1】:

升级到 4.6.1 可能会导致 GC.Collect() 调用需要更长时间, 尝试检查是否有任何显式调用垃圾收集。 这也解释了为什么在完成分配内存的作业后CPU使用率更高,如果分配的对象更多,那么垃圾收集将花费更长的时间

【讨论】:

  • 看起来你是对的,我发现并删除了一个 GC 调用,再次运行它,CPU 使用率没有上升。看起来 .net 4.6 喜欢自动处理 GC 收集,现在我所要做的就是试着记住我一开始为什么要进行此调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-22
  • 1970-01-01
  • 2023-02-08
  • 2018-01-09
  • 1970-01-01
  • 2014-08-07
  • 2020-10-09
相关资源
最近更新 更多