| <!DOCTYPE html> |
| <html> |
| <head> |
| <title>Query selector benchmark.</title> |
| <script src="../resources/runner.js"></script> |
| </head> |
| <body> |
| |
| </body> |
| <script> |
| |
| var iframe = document.createElement("iframe"); |
| iframe.style.display = "none"; |
| document.body.appendChild(iframe); |
| |
| function verifySizeExpectation(result, expectedSize) |
| { |
| if (result.length != expectedSize) |
| throw "The query did not return the expected results." |
| } |
| |
| var test = { |
| description: "This tests the performance of querySelector for a variety of common use cases.", |
| setup: function() { |
| // In order to restrict caching between operations, the tree is rebuilt from scratch. |
| var spec = PerfTestRunner.loadFile("resources/query-selector.html"); |
| iframe.contentDocument.firstChild.innerHTML = spec; |
| }, |
| run: function() { |
| var iFrameDocument = iframe.contentDocument; |
| |
| for (var repeat = 0; repeat < 5; ++repeat) { |
| /// Various multiselector. About 15% of the queries. |
| for (var i = 0; i < 150; ++i) { |
| // Complex descent. |
| var result = iFrameDocument.querySelectorAll("html body div>#complex-multi-rules1 .some-class li[data-bar].some-class"); |
| verifySizeExpectation(result, 1); |
| |
| // id tag. |
| verifySizeExpectation(iFrameDocument.querySelectorAll("#complex-multi-rules2 acronym"), 1); |
| verifySizeExpectation(iFrameDocument.querySelectorAll("[id='complex-multi-rules2'] a"), 1); |
| |
| // Multiple id + selector, sharing the same id. |
| result = iFrameDocument.querySelectorAll("#complex-multi-rules3 source, #complex-multi-rules3 li, #complex-multi-rules3 td"); |
| verifySizeExpectation(result, 11); |
| result = iFrameDocument.querySelectorAll("[id='complex-multi-rules3'] source, [id='complex-multi-rules3'] li, [id='complex-multi-rules3'] td"); |
| verifySizeExpectation(result, 11); |
| result = iFrameDocument.querySelectorAll("#complex-multi-rules3 .some-class, #complex-multi-rules3 .other-class"); |
| verifySizeExpectation(result, 7); |
| result = iFrameDocument.querySelectorAll("[id='complex-multi-rules3'] .some-class, [id='complex-multi-rules3'] li, [id='complex-multi-rules3'] .other-class"); |
| verifySizeExpectation(result, 7); |
| |
| // Several Ids. |
| result = iFrameDocument.querySelectorAll("#complex-multi-rules4 #complex-multi-rules4-sub1 #complex-multi-rules4-sub2 #complex-multi-rules4-sub3"); |
| verifySizeExpectation(result, 1); |
| result = iFrameDocument.querySelectorAll("#complex-multi-rules4 [id='complex-multi-rules4-sub1'] #complex-multi-rules4-sub2 [id='complex-multi-rules4-sub3']"); |
| result = iFrameDocument.querySelectorAll("[id='complex-multi-rules4'] [id='complex-multi-rules4-sub1'] [id='complex-multi-rules4-sub2'] [id='complex-multi-rules4-sub3']"); |
| verifySizeExpectation(result, 1); |
| |
| // Id sandwich: Multiple ids with selectors in between. |
| result = iFrameDocument.querySelectorAll("#complex-multi-rules5 div #complex-multi-rules5-left ul li.other-class #complex-multi-rules5-right table tr>td"); |
| verifySizeExpectation(result, 2); |
| result = iFrameDocument.querySelectorAll("div#complex-multi-rules5>div div#complex-multi-rules5-left ul .other-class p img#complex-multi-rules5-image"); |
| verifySizeExpectation(result, 1); |
| |
| // Named form attribute under hierarchy. |
| result = iFrameDocument.querySelectorAll("input[name='complex-multi-rules6-file-input']"); |
| verifySizeExpectation(result, 1); |
| result = iFrameDocument.querySelectorAll("form input[name='complex-multi-rules6-file-input']"); |
| verifySizeExpectation(result, 1); |
| result = iFrameDocument.querySelectorAll("form[name='complex-multi-rules6-form'] input[name='complex-multi-rules6-file-input']"); |
| verifySizeExpectation(result, 1); |
| result = iFrameDocument.querySelectorAll("form[name='complex-multi-rules6-form'] div input[name='complex-multi-rules6-file-input']"); |
| verifySizeExpectation(result, 1); |
| result = iFrameDocument.querySelectorAll("form[name='complex-multi-rules6-form'] div div input[name='complex-multi-rules6-file-input']"); |
| verifySizeExpectation(result, 1); |
| result = iFrameDocument.querySelectorAll("form[name='complex-multi-rules6-form']>div>div>input[name='complex-multi-rules6-file-input']"); |
| verifySizeExpectation(result, 1); |
| |
| // Hierarchy of tag and class. |
| result = iFrameDocument.querySelectorAll("div div a div div p.result-class"); |
| verifySizeExpectation(result, 1); |
| result = iFrameDocument.querySelectorAll("div div.some-class a.other-class div.another-class div p.result-class"); |
| verifySizeExpectation(result, 1); |
| result = iFrameDocument.querySelectorAll("div>div>a div div p.result-class"); |
| verifySizeExpectation(result, 1); |
| result = iFrameDocument.querySelectorAll("div>div.some-class>a.other-class>div.another-class>div>p.result-class"); |
| verifySizeExpectation(result, 1); |
| result = iFrameDocument.querySelectorAll("div div a div div p.result-class, div div.some-class a div div p.result-class, div div.some-class a.other-class div div p.result-class, div div.some-class a.other-class div.another-class div p.result-class"); |
| verifySizeExpectation(result, 1); |
| } |
| |
| // tag.class. About 10% of the queries |
| for (var i = 0; i < 100; ++i) { |
| result = iFrameDocument.querySelectorAll("details.details-class"); |
| verifySizeExpectation(result, 1); |
| result = iFrameDocument.querySelectorAll("summary.summary-class"); |
| verifySizeExpectation(result, 1); |
| result = iFrameDocument.querySelectorAll("article.article-class"); |
| verifySizeExpectation(result, 1); |
| } |
| |
| // Single selector query, 75% of the queries. Split between: |
| // -tag |
| // -[attribute] |
| // -exist |
| // -value=something |
| // -#id |
| // -.class |
| for (var i = 0; i < 750; ++i) { |
| // Tags. |
| result = iFrameDocument.querySelectorAll("details"); |
| verifySizeExpectation(result, 1); |
| result = iFrameDocument.querySelectorAll("summary"); |
| verifySizeExpectation(result, 1); |
| result = iFrameDocument.querySelectorAll("article"); |
| verifySizeExpectation(result, 1); |
| result = iFrameDocument.querySelectorAll("head"); |
| verifySizeExpectation(result, 1); |
| result = iFrameDocument.querySelectorAll("body"); |
| verifySizeExpectation(result, 1); |
| result = iFrameDocument.querySelectorAll("form"); |
| verifySizeExpectation(result, 1); |
| result = iFrameDocument.querySelectorAll("input"); |
| verifySizeExpectation(result, 1); |
| |
| // Attributes exists. |
| result = iFrameDocument.querySelectorAll("[data-foo]"); |
| verifySizeExpectation(result, 1); |
| result = iFrameDocument.querySelectorAll("[data-bar]"); |
| verifySizeExpectation(result, 1); |
| result = iFrameDocument.querySelectorAll("[title]"); |
| verifySizeExpectation(result, 1); |
| result = iFrameDocument.querySelectorAll("[href]"); |
| verifySizeExpectation(result, 2); |
| |
| // Attribute = value. |
| result = iFrameDocument.querySelectorAll("[data-foo=bar]"); |
| verifySizeExpectation(result, 1); |
| result = iFrameDocument.querySelectorAll("[data-bar=baz]"); |
| verifySizeExpectation(result, 1); |
| result = iFrameDocument.querySelectorAll("[title='WebKit Tempalte Framework']"); |
| verifySizeExpectation(result, 1); |
| result = iFrameDocument.querySelectorAll("[href='http://www.webkit.org/']"); |
| verifySizeExpectation(result, 1); |
| |
| // Id. |
| result = iFrameDocument.querySelectorAll("#complex-multi-rules1"); |
| verifySizeExpectation(result, 1); |
| result = iFrameDocument.querySelectorAll("#complex-multi-rules2"); |
| verifySizeExpectation(result, 1); |
| result = iFrameDocument.querySelectorAll("#complex-multi-rules3"); |
| verifySizeExpectation(result, 1); |
| result = iFrameDocument.querySelectorAll("#complex-multi-rules4"); |
| verifySizeExpectation(result, 1); |
| result = iFrameDocument.querySelectorAll("#complex-multi-rules5"); |
| verifySizeExpectation(result, 1); |
| result = iFrameDocument.querySelectorAll("#complex-multi-rules6"); |
| verifySizeExpectation(result, 1); |
| result = iFrameDocument.querySelectorAll("#complex-multi-rules7"); |
| verifySizeExpectation(result, 1); |
| result = iFrameDocument.querySelectorAll("#complex-multi-rules8"); |
| verifySizeExpectation(result, 1); |
| |
| // Id with duplicate. |
| result = iFrameDocument.querySelectorAll("#duplicate-id"); |
| verifySizeExpectation(result, 3); |
| |
| // .class. |
| result = iFrameDocument.querySelectorAll(".details-class"); |
| verifySizeExpectation(result, 1); |
| result = iFrameDocument.querySelectorAll(".summary-class"); |
| verifySizeExpectation(result, 1); |
| result = iFrameDocument.querySelectorAll(".article-class"); |
| verifySizeExpectation(result, 1); |
| result = iFrameDocument.querySelectorAll(".result-class"); |
| verifySizeExpectation(result, 1); |
| } |
| } |
| } |
| } |
| PerfTestRunner.measureTime(test); |
| </script> |
| </html> |