feat(selector): initial version of the selector

This commit is contained in:
Tobias Bosch
2014-10-28 14:46:55 -07:00
parent d0c870fb32
commit 08d4a37c06
7 changed files with 498 additions and 12 deletions
@@ -0,0 +1,17 @@
System.import('benchmarks/compiler/selector_benchmark').then(function (bm) {
bm.setup();
window.benchmarkSteps.push({name: 'CssSelector.parse', fn: bm.runParse});
}, console.log.bind(console));
System.import('benchmarks/compiler/selector_benchmark').then(function (bm) {
bm.setup();
window.benchmarkSteps.push({name: 'SelectorMatcher.addSelectable', fn: bm.runAdd});
}, console.log.bind(console));
System.import('benchmarks/compiler/selector_benchmark').then(function (bm) {
bm.setup();
window.benchmarkSteps.push({name: 'SelectorMatcher.match', fn: bm.runMatch});
}, console.log.bind(console));
@@ -0,0 +1,11 @@
module.exports = function(config) {
config.set({
scripts: [
{src: '/js/traceur-runtime.js'},
{src: '/js/es6-module-loader-sans-promises.src.js'},
{src: '/js/extension-register.js'},
{src: 'register_system.js'},
{src: 'benchmark.js'}
]
});
};
@@ -0,0 +1,10 @@
System.paths = {
'core/*': '/js/core/lib/*.js',
'change_detection/*': '/js/change_detection/lib/*.js',
'facade/*': '/js/facade/lib/*.js',
'di/*': '/js/di/lib/*.js',
'rtts_assert/*': '/js/rtts_assert/lib/*.js',
'test_lib/*': '/js/test_lib/lib/*.js',
'benchmarks/*': '/js/benchmarks/lib/*.js'
};
register(System);
@@ -0,0 +1,81 @@
import {SelectorMatcher, CssSelector} from "core/compiler/selector";
import {StringWrapper, Math} from 'facade/lang';
import {ListWrapper} from 'facade/collection';
var fixedMatcher;
var fixedSelectorStrings = [];
var fixedSelectors = [];
var COUNT = 1000;
export function setup() {
for (var i=0; i<COUNT; i++) {
ListWrapper.push(fixedSelectorStrings, randomSelector());
}
for (var i=0; i<COUNT; i++) {
ListWrapper.push(fixedSelectors, CssSelector.parse(fixedSelectorStrings[i]));
}
fixedMatcher = new SelectorMatcher();
for (var i=0; i<COUNT; i++) {
fixedMatcher.addSelectable(fixedSelectors[i], i);
}
}
export function runParse() {
var result = [];
for (var i=0; i<COUNT; i++) {
ListWrapper.push(result, CssSelector.parse(fixedSelectorStrings[i]));
}
return result;
}
export function runAdd() {
// The sum is used to prevent Chrome from optimizing the loop away...
var matcher = new SelectorMatcher();
var count = 0;
for (var i=0; i<COUNT; i++) {
count += matcher.addSelectable(fixedSelectors[i], i);
}
return count;
}
export function runMatch() {
// The sum is used to prevent Chrome from optimizing the loop away...
var count = 0;
for (var i=0; i<COUNT; i++) {
fixedMatcher.match(fixedSelectors[i], (selected) => {
count += selected;
});
}
return count;
}
function randomSelector() {
var res = randomStr(5);
for (var i=0; i<3; i++) {
res += '.'+randomStr(5);
}
for (var i=0; i<3; i++) {
res += '['+randomStr(3)+'='+randomStr(6)+']';
}
return res;
}
function randomStr(len){
var s = '';
while (s.length < len) {
s += randomChar();
}
return s;
}
function randomChar(){
var n = randomNum(62);
if(n<10) return n; //1-10
if(n<36) return StringWrapper.fromCharCode(n+55); //A-Z
return StringWrapper.fromCharCode(n+61); //a-z
}
function randomNum(max) {
return Math.floor(Math.random() * max);
}