为什么我的代码没有使用可用的处理器周期?

时间:2010-08-24 13:09:43

标签: .net performance com arcobjects

我为ESRI ArcEditor编写了一个插件,可以在道路网络上运行一些验证检查。为了检查规则是否都满足,它基本上会在选定的特征上做一堆不同的交叉,一些缓冲和包络等。

它是用C#编写的。

现在我注意到,在所选功能上运行给定算法确实需要很长时间。我加载了ANTS探测器并优化了瓶颈,直到我无能为力。

我注意到一个奇怪的事情是,ANTS报告时间线中几乎没有CPU使用情况 - 平坦线。然后我验证了在验证操作运行时,使用任务管理器处理器保持在10%到15%以下。这对我来说毫无意义。为什么不使用可用的处理器周期?

没有I / O正在发生,因为它从ArcSDE加载所有内容。我还验证了在验证过程中没有明显的网络流量,认为它可能正在等待ArcEditor和服务器之间的com。 然后我检查了服务器上的处理器,以确保没有委托给它处理,但是在验证过程中它的CPU使用率保持稳定在1%。

然后我认为ArcEditor可能会抑制插件可以运行的优先级,或类似的疯狂。所以我插入了一个数学操作系统,可以最大化CPU大约10秒,而不是验证程序,它就是这样做的。 CPU使用率稳定在50%以上,这是有道理的,因为数学运算将最大化我的Core 2 Duo的核心之一。那里没有运气。并且有超过1GB的RAM可用。

最后,我一直试图找到perfmon的问题,但那里没有运气。没有多少经验,但找不到任何错误。

是否因为ArcObjects COM接口?虽然我也用perfmon检查.NET Interop计数器。

我不知所措。

所以任何帮助或提示都将不胜感激。

1 个答案:

答案 0 :(得分:1)

可能是线程问题。 COM将自动封送COM接口上的方法调用到正确的线程。这通常是程序的UI线程。这非常慢,因为它需要线程上下文切换,并且UI线程必须处于调度调用的状态。几乎没有CPU周期被烧毁,一切都在阻塞,直到通话结束。

在创建的同一个线程上使用COM对象。如果此对象具有STA要求,则应该是UI线程。他们通常会这样做。