如何解决从C ++切换到C#时,为什么从BHO内部调用IHTMLElement2.getBoundingClientRect会慢几倍?
我正在尝试创建用于遍历HTML页面DOM的BHO的各种选项。一个实现使用C#,并且在ApartmentModel
设置为Both
的情况下在注册表中注册。它是这样的:
- 检索
IWebBrowser2.Document
- 从文档对象获取
IDocumentSelector
接口 - 调用
IDocumentSelector.querySelectorAll("*")
会产生一个IHTMLDOMChildrenCollection
参考 - 获取
IHTMLDOMChildrenCollection.length
- 在
0..length
范围(for(int index = 0; index < totalCount; index++)
)内运行循环, - 内部循环迭代使用
IHTMLDOMChildrenCollection.item()
获取每个集合项, - 将收集项引用投射到
IHTMLElement2
, - 获取
IHTMLElement2.getClientBoundingRect()
,并且效果很好,在200-300毫秒内遍历了大约1500个元素的页面(循环持续时间是通过在循环前后读取DateTime.UtcNow
并从读数差中获取TotalMilliseconds
来测量的)。
使用Visual C ++和ATL完成的另一种实现。它的功能与C#版本基本相同。 CComQIPtr
用于代替强制类型转换。循环是相同的。还已将ApartmentModel
设置为Both
进行注册。
C ++实现在40-60毫秒内遍历同一页面DOM。时间是通过在循环之前和之后读取GetTickCount()
并得出差值来测量的。
然后,我从内部循环迭代中排除了步骤8-获得了项并从中获得了IHTMLElement2
,但是没有调用getClientBoundingRect()
。更改之后,两种实现都几乎同时在40-50毫秒的时间内运行。
这看起来很奇怪。为什么只有getClientBoundingRect()
会受到影响?它有什么特别之处以至于放慢了速度?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。