【发布时间】: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