3

IE7がWebアプリへのアクセスをハングする状況があります。George V. Reillyからの優れた提案に基づいて、WinDbgをインストールしてIEシンボルをダウンロードし、それらのシンボルを使用するようにProcess Explorerをセットアップしてから、ProcessExplorerを使用してハングしたスレッドのスタックトレースを取得しました。

以下にスタックトレースを貼り付けました。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
4

2 に答える 2

3

スタック トレースによると、DOM を変更している最中です。以前の投稿でコメントしたように、IE は DOM で読み取りと書き込みの両方を行う場合、(Firefox や Chrome と比較すると) 非常に非効率的です。

パフォーマンスの問題は、次の方法で DOM の読み取りと書き込みの両方を減らして最適化することで対処できます。

  1. XPATH (CSS) セレクター メソッド ( ) の代わりに、可能 な限り単純な DOM プロパティとメソッド ( Document.getElementByIdDomElement.parentNodeDomElement.childNodes[]、など) を使用して DOM をナビゲートするDomElement.nextSiblingDomElement.querySelector
    • これは、querySelectorが IE の下で O(N) と動作するためです。N はDOM 全体のサイズですquerySelector。つまり、子を持たないリーフ ノードを呼び出した場合でも、DOM 全体をトラバースするというペナルティが発生します。
    • querySelectorDOM のかなりのサブセットで各要素に対して1 つ以上の呼び出しをトリガーすると、基本的に O(N^2) のペナルティを支払うことになります。
    • YUI のYAHOO.util.Selector.query、プロトタイプのelement.downelement.upelement.selectすべてがquerySelector呼び出しを内部的に使用することに注意してください
  2. 可能であれば、UI の動作を変更して、可能な限り多くの DOM トラバーサルと変更をスキップまたは延期する
    • 一度に少しの情報しか提示しない。追加の処理/変更を続行するために、ユーザーに (展開リンクなどで) クリックを強制する
  3. Javascript から Flash または Java に切り替えます。

YUI を使用していることを考えると、オプション 1 に関する限り自由度が高くない可能性があり、オプション 3 はほぼ確実に非オプションであると想像できます。残念ながら、オプション2を残します。

于 2009-02-23T03:16:29.263 に答える
1

すべてのブラウザーでハングしますか、それとも IE7 だけですか?

唯一気になるのは「IEDevToolbar.dll!」です。

また...アプリがすべきではないことをしている可能性があります。

于 2009-02-23T02:24:35.457 に答える