Дзен-трансгуманист, да ты мастер обфускации ))
Скрипты наверно эффективнее через тебя пропускать, нежели через какой-нибудь компрессор-минификатор :) |
Цитата:
Насколько мне известно применение побитовых операций в js не приводит к увеличению скорости, а скорее наоборот. Поэтому ты добавил тормоза в программу и оправдываешь их инженерным образованием. |
Цитата:
function test1(defs) {
return {1:0, 2:2, 4:1}[defs];
}
function test2(defs) {
return (defs & ~1) % 3;
}
function test3(defs) {
return [0,0,2,,1][defs];
}
var lastTime=(new Date()).getTime();
for(var i = 0; i < 100000; i++) {
test1(i & 1);
}
alert("Время заняло с использованием объекта (ms): " + ((new Date()).getTime()-lastTime));
var lastTime=(new Date()).getTime();
for(var i = 0; i < 100000; i++) {
test2(i & 1);
}
alert("Время заняло с использованием битов (ms): " + ((new Date()).getTime()-lastTime));
var lastTime=(new Date()).getTime();
for(var i = 0; i < 100000; i++) {
test3(i & 1);
}
alert("Время заняло с использованием массива (ms): " + ((new Date()).getTime()-lastTime));
Opera 12.13: Время заняло с использованием объекта (ms): 61 Время заняло с использованием битов (ms): 17 Время заняло с использованием массива (ms): 20 |
пример с массивом и битами работают почти с одинаковой скоростью... Хотя если позапускать несколько раз, то видно что идентичны.. Но вот с объектами все намного хуже.
Можно провести тест со свитчем:
function test1(defs) {
switch(defs) {
case 1:
return 0;
case 2:
return 2;
case 4:
return 1;
deafult:
return 0;
}
}
var lastTime=(new Date()).getTime();
for(var i = 0; i < 100000; i++) {
test1(i & 1);
}
alert("Время заняло с использованием switch (ms): " + ((new Date()).getTime()-lastTime));
Opera 12.13 Время заняло с использованием switch (ms): 15 |
Цитата:
|
Цитата:
function test7(x) {
return x !== 2 ? x >> 2 : 2;
}
var lastTime=(new Date()).getTime();
for(var i = 0; i < 100000; i++) {
test7(i & 1);
}
alert("Время с использованием x !== 2 ? x >> 2 : 2 (ms): " + ((new Date()).getTime()-lastTime));
return (e.button & ~1) % 3; // 1. ~1 // 2. e.button & x // 3. x % 3; Цитата:
Цитата:
Если принимать во внимание, что события мыши могу обрабатываться довольно часто, то решение с объектом, пускай и наглядным, приведет к лишним задр*чкам и в без того медленном IE. Впрочем, надо тестировать... |
Цитата:
Цитата:
Цитата:
|
Цитата:
Ну, а Gozar он добрый и пушистый (особенно когда не бреется). Только тщательно это скрывает :) |
Object.create() IE9,10 bug
Bug
var obj = Object.create({}.constructor.prototype);
//var obj = Object.create(Object.getPrototypeOf({}));
//var obj = {};
obj['0'] = null;
obj['1'] = null;
alert(obj.hasOwnProperty('0')); // IE9,10 - false
alert(obj.hasOwnProperty('1')); // IE9,10 - false
Fix
var obj = Object.create({}.constructor.prototype);
//var obj = Object.create(Object.getPrototypeOf({}));
//var obj = {};
obj['0'] = null;
obj['1'] = null;
obj['x'] = null; // fix
alert(obj.hasOwnProperty('0')); // true
alert(obj.hasOwnProperty('1')); // true
|
Жесть… я только начинал верить в IE :( в 11 версии не исправили
------------ причем, если сразу же удалить fix, то баг останется, поэтому вот такой декоратор для Object.create не прокатил:
//IE9-11 Object.create bug fix
(function () {
var object = Object.create({});
object[0] = null;
return object.hasOwnProperty(0); //→ false in IE9-11
}()) || (Object.create = new function () {
var create = Object.create;
return function (prototype, properties) {
var object = create(prototype, properties);
object[0] = null;
object.fix = null;
delete object[0];
//delete object.fix; //нельзя удалять!
return object;
};
});
придется фиксить так:
//IE9-11 Object.create bug fix
(function () {
var object = Object.create({});
object[0] = null;
return object.hasOwnProperty(0); //→ false in IE9-11
}()) || new function () {
var create = Object.create;
Object.create = function (prototype, properties) {
function NOP() {}
NOP.prototype = prototype;
//Object.defineProperties fixes a bug
return properties ? create(prototype, properties) : new NOP;
};
};
|
| Часовой пояс GMT +3, время: 18:45. |