如何解决VB.NET 1.1应用程序的性能衰减?

时间:2010-05-20 07:23:22

标签: .net vb.net winforms performance .net-1.1

我使用 VB.NET 编写的单线程Windows窗体应用程序,目标是 Framework 1.1 。该软件通过串行接口与外部板通信,它主要由一个运行一些测试的状态机组成,在一个定时器和一个50ms的间隔的循环中驱动。

用户界面的反馈是通过测试期间提出的一些自定义事件完成的。

令我发疯的问题是,性能会随着时间的推移而略有下降,特别是在1200/1300测试操作之后。占用的内存不会随着时间的推移而增加,只有CPU似乎对此问题感兴趣。

奇怪的是,针对框架2.0并使用相同的相同代码,我没有这个问题。

我知道如果不查看代码就很难,但是你有什么建议我可以解决这个问题吗?

编辑:我真的迷失了,经过几次密集的工作后,应用程序开始变慢。所选行与其过程相关,如果有帮助的话。

EDIT2 :使用Windows任务管理器我在每次操作结束时检测到Handles计数器增加1 。我不知道它是否是原因但是当句柄计数器达到大约1500个句柄时应用程序开始减速。我检查了每次操作后都调用了所有必需的 RemoveHandler 。有什么想法吗?

EDIT3 :我发现处理问题是由我们用来与串行设备通信的C ++库生成的。然后它发生在.NET 1.1和.NET 2.0中。差异,这很奇怪,如果目标.NET 1.1应用程序减速/冻结而不是.NET 2.0我达到了超过30000个句柄而不会失去性能。现在我不知道这个问题是否真的是由这个丢失的句柄引起的,我会尝试向C ++库的开发人员提出纠正问题,看看它是否解决了我在.NET 1.1上遇到的问题。

full image here

alt text http://img341.imageshack.us/img341/6923/process.png

4 个答案:

答案 0 :(得分:2)

完全披露:我在Visual Studio Profiler团队中。

编辑:由于VS Profiler无法与.NET 1.1一起使用,因此以下内容无效。您是否尝试在Profiler下运行代码? Visual Studio 2005/2008(开发版/团队套件)和Visual Studio 2010 Premium / Ultimate具有内置的分析器。还有第三方.NET分析器可用。

在探查器下运行代码将显示CPU在哪些方面做了大量工作。如果您仅在性能下降时进行配置,则结果应该可以帮助您了解原因。

或者,您可以模拟廉价的分析:调试您的应用程序并定期进入它以查看调用堆栈上正在执行的内容。


此外,您的计算机是否安装了.NET Framework 1.1 SP1?你能在其他机器上重现这个问题吗?

答案 1 :(得分:2)

好的,既然你不能使用Performance Profiler,我可以想到两件事要尝试。

1)这是一个愚蠢/明显的问题。你是否绝对确定你是否在处理实施IDispose的所有内容? 即使您确定要再次检查并再次检查,请留意不会被丢弃的临时物体,例如

   string s = objA.GetAThing().ToString()

其中GetAThing()返回一个实现IDispose的对象。

2)您是否尝试过强制垃圾收集? 阅读Rico Mariani's Performance Tidbits,有时不仅可以拨打GC.Collect(),有时也是必要的 我们有一个庞大的.Net winforms应用程序,我们需要每十分钟左右强制一次收集。如果我们不这样做,应用程序会在几个小时后开始研磨。

希望这会有所帮助:)

<强>更新
太遗憾了。你有C ++源码吗?或者你坚持这个问题?

如果卡住,您可以让应用程序在终止当前实例时定期启动新实例。

您可以使用锁定的文件或Mutex来确保新实例在第一次终止之前不会开始处理。

答案 2 :(得分:1)

首先,我会使用Windows中包含的Performance Profiler,就像Tess建议here一样。

然后我会像她建议here那样使用windbg。

我只建议windbg第二,因为如果你还没有使用它,你会参加一个小的WTF会议,直到你得到它(它完全值得一试)。也许通过玩计数器你可以找到问题。

答案 3 :(得分:1)

<强>嗯

有了这么有限的信息,这可能是一百万件事。

使用一些'Zen'编程我会说,摆脱计时器并开始使用线程。

使用具有取消标记的常用模式,并使测试在while循环中运行(如果需要的话)。