2016-08-30 54 views
0

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

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

在升级之前,每当我运行这个sequence1(程序是单线程的)时,机器使用25%的CPU(在4核心机器中)。 自升级以来,这种行为发生了改变,如果我用sequence1开始我的程序,我得到正常行为(序列运行在25%),但如果在执行某些算术计算并分配一些类之前,我们称之为sequence1sequence0,然后当我到达sequence1它使用70-90%的CPU。

我认为这可能会连接到垃圾收集机制。我试过设置所有的类为空,并在序列0之后立即调用GC.Collect(在致电序列之前),但我仍然得到序列1,其运行在70-90%;也许这与GC算法有关,它更新了它在执行序列0时发生了脱落?

+0

也许'gcConcurrent'现在处于活动状态?你可以玩app.config文件中的行为。主要问题是,现在速度更快吗?也可以是PGO(参见我的一个重要问题)。 – leppie

+0

您需要描述应用程序的性能,而不是对问题进行猜测。首先你应该看看.NET的perfmon计数器,并将这两个运行与这些运行进行比较,以查看有什么不同。 – Paolo

+0

@Paolo,我会尝试perfmon和比较,但即使没有比较,单线程程序不应该超过25%(更不用说90%),应该吗? –

回答

1

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

+0

看起来像你是对的,我发现并删除了一个GC呼叫,再次运行它的CPU使用率没有上升。它看起来像.net 4.6喜欢自动处理GC收集,现在我所要做的就是尽量记住为什么我首先要做这个调用。 –

相关问题