0

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

它是用 C# 编写的。

现在我注意到的是,在选定的特征上运行给定的算法确实需要很长时间。我加载了 ANTS 分析器并优化了瓶颈,直到我无能为力为止。

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

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

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

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

是因为 ArcObjects COM 接口吗?尽管我也使用 perfmon 检查了 .NET Interop 计数器。

我很茫然。

因此,任何帮助或提示将不胜感激。

4

1 回答 1

1

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

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

于 2010-08-26T16:52:26.450 回答