我遇到IE7挂起访问我的网络应用程序的情况。基于来自suggestion的优秀George V. Reilly,我安装了WinDbg以下载IE符号,设置Process Explorer以使用这些符号,然后使用Process Explorer获取挂起线程的堆栈跟踪。
我已粘贴下面的堆栈跟踪。更熟悉IE内部的人是否知道发生了什么,或者建议如何推进这个?
ntkrnlpa.exe!KiUnexpectedInterrupt+0x8d
ntkrnlpa.exe!PsDereferencePrimaryToken+0x362
ntkrnlpa.exe!KiDeliverApc+0xb3
ntkrnlpa.exe!KiDispatchInterrupt+0x5a2
ntkrnlpa.exe!SeOpenObjectAuditAlarm+0x1ce
mshtml.dll!CTreePos::GetCp+0x5a
mshtml.dll!CFlowLayout::GetNestedElementCch+0x7d
mshtml.dll!CDisplay::FormattingNodeForLine+0x1d5
mshtml.dll!CFlowLayout::LineStart+0xdb
mshtml.dll!CDisplayPointer::GetLineStart+0x44
mshtml.dll!CDisplayPointer::IsAtBOL+0x4e
mshtmled.dll!CCaretTracker::PositionCaretAt+0xf9
mshtmled.dll!CCaretTracker::Init2+0x54
mshtmled.dll!CSelectionManager::SetCurrentTracker+0x26
mshtmled.dll!CSelectionManager::CreateTrackerForContext+0x1c0
mshtmled.dll!CSelectionManager::SetEditContext+0x8b
mshtmled.dll!CSelectionManager::SetEditContextFromElement+0x2ed
mshtmled.dll!CSelectionManager::EnsureEditContextClick+0x343
mshtmled.dll!CSelectionManager::HandleEvent+0xb9
mshtmled.dll!CHTMLEditor::PostHandleEvent+0x89
mshtml.dll!CDoc::HandleSelectionMessage+0x1e0
mshtml.dll!CDoc::PumpMessage+0xb69
mshtml.dll!CDoc::OnMouseMessage+0x3d7
mshtml.dll!CDoc::OnWindowMessage+0x748
mshtml.dll!CServer::WndProc+0x78
USER32.dll!InternalCallWinProc+0x28
USER32.dll!UserCallWinProcCheckWow+0x150
USER32.dll!CallWindowProcAorW+0x98
USER32.dll!CallWindowProcW+0x1b
IEDevToolbar.dll!DllUnregisterServer+0xe21d
USER32.dll!InternalCallWinProc+0x28
USER32.dll!UserCallWinProcCheckWow+0x150
USER32.dll!DispatchMessageWorker+0x306
USER32.dll!DispatchMessageW+0xf
IEFRAME.dll!CTabWindow::_TabWindowThreadProc+0x189
kernel32.dll!BaseThreadStart+0x37
答案 0 :(得分:3)
基于堆栈跟踪,它正在改变DOM。正如您在上一篇文章中所评论的那样,IE在DOM上进行读写操作时效率极低(与Firefox和Chrome相比)。
通过以下方式减少和优化DOM的读取和写入,可以解决性能问题:
Document.getElementById
,DomElement.parentNode
,DomElement.childNodes[]
,DomElement.nextSibling
等)而不是XPATH(CSS)选择器来导航DOM方法(DomElement.querySelector
)
querySelector
在IE 下表现为O(N),其中N是整个DOM 的大小 - 也就是说,您将支付即使你在没有子节点的叶节点上调用querySelector
,也会遍历整个DOM!querySelector
调用,那么您实际上是支付O(N ^ 2)代价YAHOO.util.Selector.query
,原型的element.down
,element.up
,element.select
都在内部使用querySelector
来电鉴于你正在使用YUI,你可能没有足够的自由度,因为选项1可以,我可以想象选项3几乎肯定是你的选择。不幸的是,它留下了选项2。
答案 1 :(得分:1)
它是在所有浏览器中还是只在IE7中挂起?
唯一突出的是“IEDevToolbar.dll!”
另外......可能是你的应用做了不应该的事情。