marrow.observatory vs jquery bind events
JavaScript performance comparison
Preparation code
<script src="//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script src="https://gist.github.com/a-ignatov-parc/c5cff670ac12332fec2c/raw/22dc29647d407fce81278a51dd49f19f069c144f/core.observatory.js"></script>
<script src="https://gist.github.com/a-ignatov-parc/a31dc71ffeb0202b179a/raw/c49ef0e0e0a65894f5ebf43b2e515bf1fce04258/marrow.observatory.js"></script>
<script>
var YES = true,
NO = false,
observatory3 = new Observatory3(),
observatory2 = new Observatory2(),
observatory = (function() {
var regex = /\s+/,
eventMap = {
global: {}
},
rebuild = function() {
cache = {};
console.log(1);
for (var namespace in eventMap) {
// Проверяем принадлежит ли свойство объекту и не "заглушен" ли перебераемый неймспейс
if (eventMap.hasOwnProperty(namespace) && !mutedEvents[namespace]) {
var events = eventMap[namespace];
for (var key in events) {
if (events.hasOwnProperty(key) && events[key] && events[key].length) {
if (namespace === 'global') {
cache[key] = events[key];
} else {
cache[key] || (cache[key] = []);
cache[key] = cache[key].concat(events[key]);
cache['.' + namespace] || (cache['.' + namespace] = []);
cache['.' + namespace] = cache['.' + namespace].concat();
cache[key + '.' + namespace] = events[key];
}
}
}
}
}
},
needToRebuild = NO,
mutedEvents = {},
cache = {};
return {
on: function(eventName, handler, context) {
// Создаем массив `events` в который парсится строка `eventName` на случай если в ней передано
// несколько событий или они переданы с лишними пустыми символами.
var events = eventName.split(regex),
target = eventMap.global,
parts;
// Проверяем было ли в строке `eventName` передано несколько событий.
// Если да, то по очереди их навешиваем пробегаясь по созданному массиву `events`
if (events.length < 2) {
eventName = events[0];
parts = eventName.split('.');
if (!eventName || !handler || typeof(handler) !== 'function') {
return this;
}
if (!parts[parts.length - 1]) {
parts.pop();
}
if (parts[0]) {
if (parts.length > 1) {
target = eventMap[parts[1]] || (eventMap[parts[1]] = {});
}
target[parts[0]] || (target[parts[0]] = []);
target[parts[0]].push({
h: handler,
c: context
});
}
needToRebuild = YES;
//rebuild();
} else {
for (var i = 0, length = events.length; i < length; i++) {
arguments.callee.call(this, events[i], handler, context);
}
}
return this;
},
off: function(eventName, handler, context) {
var parts = eventName.split('.'),
parseList = function(list) {
var newList = [];
for (var i = 0, length = list.length; i < length; i++) {
var bundle = list[i];
if (!(bundle.h == handler && (context != null && bundle.c == context || context == null))) {
newList.push(bundle);
}
}
return newList;
};
if (!parts[parts.length - 1]) {
parts.pop();
}
for (var namespace in eventMap) {
if (eventMap.hasOwnProperty(namespace) && (!parts[1] || parts[1] == namespace)) {
var events = eventMap[namespace];
if (typeof(handler) === 'function') {
if (events[parts[0]]) {
events[parts[0]] = parseList(events[parts[0]]);
} else {
for (var key in events) {
if (events.hasOwnProperty(key) && events[key] && events[key].length) {
events[key] = parseList(events[key]);
}
}
}
} else {
if (events[parts[0]]) {
delete events[parts[0]];
} else if (!parts[0] && parts[1]) {
delete eventMap[namespace];
delete mutedEvents[namespace];
}
}
}
}
needToRebuild = YES;
//rebuild();
return this;
},
trigger: function(eventName, params) {
var events = cache[eventName];
if (needToRebuild) {
rebuild();
needToRebuild = NO;
}
if (events) {
for (var i = 0, length = events.length; i < length; i++) {
var bundle = events[i],
handler = bundle.h,
context = bundle.c;
if (typeof(handler) === 'function') {
if (context == null) {
context = this;
}
handler.apply(context, [eventName].concat(params));
}
}
}
return this;
},
mute: function(namespace) {
if (namespace != null && namespace != 'global' && !mutedEvents[namespace]) {
mutedEvents[namespace] = true;
needToRebuild = YES;
//rebuild();
}
},
unmute: function(namespace) {
if (namespace != null && namespace != 'global' && mutedEvents[namespace]) {
delete mutedEvents[namespace];
needToRebuild = YES;
//rebuild();
}
}
};
})();
</script>
Preparation code output
Test runner
Warning! For accurate results, please disable Firebug before running the tests. (Why?)
Java applet disabled.
| Test | Ops/sec | |
|---|---|---|
jquery |
|
pending… |
marrow.observatory v1.0.1 |
|
pending… |
marrow.observatory v1.1.0 |
|
pending… |
marrow.observatory v1.2.0 |
|
pending… |
Compare results of other browsers
Revisions
You can edit these tests or add even more tests to this page by appending /edit to the URL. Here’s a list of current revisions for this page:
- Revision 1: published by Anton Ignatov
- Revision 2: published by Anton Ignatov
- Revision 3: published by Anton Ignatov
- Revision 4: published by Anton Ignatov
0 comments