1

次のコードは、次のブラウザーでゆっくりと実行されます。

  • クロム 26.0.1410.65 (Mac)
  • サファリ 6.0.4 (マック)

HTML:

<ul></ul>

<script type="text/html" id="template">
<li>
  Lorem ipsum dolor…
</li>
</script>

コーヒースクリプト:

# Setup
list = $ 'ul'
templateText = $('#template').text()

# Append 1000 list items
list.append templateText for i in [1..1000]

…しかし、テンプレートから空白と改行を削除すると、非常に高速に実行されます。

自分で試してみてください: http://jsfiddle.net/cEK2x/2/

Firefox 26.0 (Mac)、Chrome Canary 28.0.1500.3 (Mac)、および IE9 では、この問題は発生しません。

4

1 に答える 1

0

WebKitメーリングリストのRyosuke Niwaは、WebKitトラッカーに登録されたバグを指摘してくれました:

その理由は、空のテキスト ノードのレンダラーを作成しないため、Node::attach() で最悪の O(N2) ケースにぶつかっているためです。(Node::attach() の FIXME を参照してください)。

このパッチは、O(N2) ケースを回避するためにループを回避するロジックを追加します。具体的には、レンダラーを作成しないことを再度決定したテキスト ノードに遭遇した場合、パッチはループを回避します。テキスト ノードのレンダラーを作成しないことを再び決定したという事実は、兄弟ノードの残りの Text::textRendererIsNeeded() の結果の影響がないことを示しているため、この救済は合理的です。

于 2013-05-08T17:29:39.437 に答える