C++ C++;基于COM的应用程序?

C++ C++;基于COM的应用程序?,c++,optimization,com,resources,C++,Optimization,Com,Resources,警告:我不确定这是否是一个正确的SO编程问题 我在使用MS Office套件时遇到了严重的性能问题,主要原因是我为处理文档而进行的数百万次COM调用。部分问题通过使用ooxmlsdk而不是使用本机应用程序的API得到了解决。然而,ooxmlsdk本身会进行COM调用,这会减慢速度(是的,我已经适当地运行了visualstudio的内置性能分析器和BoundsChecker,并确保算法是我们可以始终使用的最佳算法)。我认为缓存层可以大大加快速度(有时会将执行时间缩短四分之一)(但很明显,速度会根据

警告:我不确定这是否是一个正确的SO编程问题

我在使用MS Office套件时遇到了严重的性能问题,主要原因是我为处理文档而进行的数百万次COM调用。部分问题通过使用ooxmlsdk而不是使用本机应用程序的API得到了解决。然而,ooxmlsdk本身会进行COM调用,这会减慢速度(是的,我已经适当地运行了visualstudio的内置性能分析器和BoundsChecker,并确保算法是我们可以始终使用的最佳算法)。我认为缓存层可以大大加快速度(有时会将执行时间缩短四分之一)(但很明显,速度会根据我的访问模式而变化,而访问模式又由文档的内容结构控制)

<> P>鉴于COM和C++都已经存在了这么长时间,我惊讶地发现,基于C++的COM应用程序的优化材料太少了。(在谷歌上快速搜索足以证明我的观点,尽管我不介意被证明是错的!)

  • 所以,如果你们能帮我从互联网上挖掘出一些相关的文件,那就太好了
  • 还有,(因为我的工作很明显)我的经验还值得写一篇论文吗

编辑:澄清:我并不是真的在寻找替代方案(因为现在改变基础架构已经太晚了)。我感兴趣的是阅读人们过去可能遇到的类似问题,以及他们如何克服这些限制。

COM设计上与语言/平台无关。
所以寻找C++特定的优化方法有点脱离上下文。对于COM平台和COM服务器,C++客户端只是客户端之一,只运行更优化的机器代码。 COM是用于服务器-客户端交互/通信的协议/体系结构。
因此,最小化服务器访问本身比优化服务器访问操作更重要

另一方面,一些COM服务器只提供C/C++客户端可用的低级接口。我认为IE浏览器控制是最好的例子。对于这些COM服务器,使用C++可以产生很大的性能改进。但是AFAIK MS Office套件不提供这样的低级接口

<> P>这是很可能的,无论是在C++、C语言还是VB6中构建MS Office套件访问模块,COM的特定处理成本(调用COM服务器接口方法和接收结果)都可以被相同的度量。
<> P>我认为,C++客户端在COM区域不具有更多的优化选项,这应该是优化方法的关键点(如引入你已经做过的本地缓存备份)。

很有可能C++不被责怪——它很有可能像编组一样在大多数时间内消耗和消耗。不要忘记,您还将为进程内服务器进行编组—以防使用者和服务器线程模型不兼容。在某些情况下,您还可以花费大量时间进行同步

消除或优化编组(有像“自由线程编组器”这样的东西,我自己没有,但在提高性能方面看起来很有希望)将给您带来巨大的提升-每个调用都将直接进行,而不是大量的布线。同样,调优同步(使其细粒度和最小化)也可以提高性能

我们曾经在STA组件中遇到严重的性能问题——来自不同使用者线程的调用将通过代理进行序列化。由于每个调用都会阻塞很长一段时间(等待后端执行复杂的数据处理),所以所有其他线程都只是挂在那里等待轮到它们-服务器将一次处理一个请求。我们重新设计了调用——它现在只是“发布”请求,一旦处理完成,就会触发COM事件。这解决了问题-现在“等待”被移到调用之外,因此COM同步不会阻塞所有线程太长时间并抑制并行性。这不是任何语言所特有的,只是COM并发的工作方式。您可以通过仔细记录所有呼叫并查看日志来发现这些问题


正如你问的C++部分,当然可以很容易地对配置文件-C++代码进行详细的描述。在我看来,你不太可能找到值得注意的东西,但同样,在你分析之前你不知道——也许你的代码中有一些很愚蠢的东西。有一件事是可以优化的,那就是达到适合您的线程模型的级别。

只要检查一下显而易见的:COM到处都使用
BSTR
,其中包含
WCHAR[]
。您的应用程序是使用
WCHAR
,还是每次调用时都在
char
WCHAR
之间编组?

这是个好问题;我认为优化COM应用程序的最佳方法之一是将它们从COM迁移出去。COM在概念上和实现上都会带来大量的开销。@Paul Sonier:如果可以的话,我会的。有时候,就像我的情况一样,没有其他的选择。如果不是通过COM,我如何编写插件/与Office应用程序通信?@dirkgently:据我所知,它们公开托管扩展。@DeadMG:这不是不推荐的吗?无论如何,现在重新编写整个该死的东西已经太晚了(而且有一些理由坚持使用C++)。@dirkgently:C++的托管扩展-首先,它变成了C++/CLI并且仍然存在,其次,我的意思是,Office公开了托管入口点。1)没有服务器访问。处理在打开文档的同一台机器上进行。2)理论上,你是正确的,我对COM接口的本地C++绑定实现的性能质量有非常不好的感受。我在C++和C++中有相同的代码