解决方案从 .net 4 升级到 4.6.1 后性能下降
Performance degradation after solution upgrade from .net 4 to 4.6.1
我已将我的解决方案从 .net 4.0 升级到 .net 4.6.1 并观察到一些奇怪的行为。
我有一个程序,在这个程序中我有一个序列(称之为 sequence1),它读取双精度数组的二进制文件并将数据保存在 RAM 中。
在升级之前,每当我 运行 这个 sequence1(程序是单线程的)机器使用了 CPU 的 25%(在 4芯机)。
这种行为自升级后发生了变化,如果我用 sequence1 启动我的程序,我会得到正常的行为(序列 运行s 在 25%),但如果在 sequence1 之前 我 运行 做一些算术计算并分配一些 类 我们称它为 sequence0,然后当我到达 sequence1 它使用了 CPU.
的 70-90%
我认为这可能与垃圾回收机制有关。我已经尝试将所有 类 设置为 null 并在 sequence0 之后立即调用 GC.Collect
(在调用 sequence1 之前)但是我仍然得到 sequence1 运行 的 70-90%;也许这与在执行 sequence0?
时更新阈值的 GC 算法有关
升级到 4.6.1 可能会导致 GC.Collect() 调用花费更长时间,
尝试检查是否有任何对垃圾收集的显式调用。
这也解释了为什么你在完成分配内存的作业后得到更多 CPU 使用,如果有更多分配的对象,那么垃圾收集将花费更长的时间
我已将我的解决方案从 .net 4.0 升级到 .net 4.6.1 并观察到一些奇怪的行为。
我有一个程序,在这个程序中我有一个序列(称之为 sequence1),它读取双精度数组的二进制文件并将数据保存在 RAM 中。
在升级之前,每当我 运行 这个 sequence1(程序是单线程的)机器使用了 CPU 的 25%(在 4芯机)。 这种行为自升级后发生了变化,如果我用 sequence1 启动我的程序,我会得到正常的行为(序列 运行s 在 25%),但如果在 sequence1 之前 我 运行 做一些算术计算并分配一些 类 我们称它为 sequence0,然后当我到达 sequence1 它使用了 CPU.
的 70-90%我认为这可能与垃圾回收机制有关。我已经尝试将所有 类 设置为 null 并在 sequence0 之后立即调用 GC.Collect
(在调用 sequence1 之前)但是我仍然得到 sequence1 运行 的 70-90%;也许这与在执行 sequence0?
升级到 4.6.1 可能会导致 GC.Collect() 调用花费更长时间, 尝试检查是否有任何对垃圾收集的显式调用。 这也解释了为什么你在完成分配内存的作业后得到更多 CPU 使用,如果有更多分配的对象,那么垃圾收集将花费更长的时间