Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
var i=2000000,j=0,start=new Date().getTime();
while(i--){
j++;
}
console.log('Предусловие:'+(new Date().getTime()-start));
var i=2000000,j=0,start=new Date().getTime();
do{
j++;
}while(i--);
console.log('Постусловие:'+(new Date().getTime()-start));
var first=0,second=0;
for(var k=0;k<1000;k++){
var i=2000,j=0,start=new Date().getTime();
while(i--){
j++;
}
first+=(new Date().getTime()-start);
var i=1999,j=0,start=new Date().getTime();
do{
j++;
}while(i--);
second+=(new Date().getTime()-start);
}
console.log('Предусловие:'+(first/1000));
console.log('Постусловие:'+(second/1000));
var first=0,second=0;
for(var k=0;k<10000;k++){
var i=20000,j=0,start=new Date().getTime();
while(i--){
j++;
}
first+=(new Date().getTime()-start);
var i=19999,j=0,start=new Date().getTime();
do{
j++;
}while(i--);
second+=(new Date().getTime()-start);
}
console.log('Предусловие:'+(first/1000));
console.log('Постусловие:'+(second/1000));
А знаете ли вы, что перерисовка документа — только когда очищается стек вызовов?
А знаете ли вы, что перерисовка документа начнётся только после окончания выполнения всех функций, хотя бы на короткое время? Поэтому для перерисовки используют setTimeout( function(){...}, 1), где функция — продолжение необходимых нам действий. Иногда пишут задержку даже 0. Это неочевидно, но тоже означает минимальную паузк в любом браузере. ...
var counter=0,
handle=setInterval(function f(){counter++;},0);
setTimeout(function f2(){
clearTimeout(handle);
alert(counter);
},1000);
(function(){
var n = 1;
delete n;
alert(n);
}())
Если в короток, то он удаляет объект, свойство объекта или элемент массива по указанному индексу. alert(some_undefined_var);//обращаемся к несуществующей переменной
т.е. после удаления глобальной переменной уже не играет роли, создавалось ли что-то ранее с таким именем или нет. Её нет и всё. (function init(){//функция-обёртка
var JUST_A_VAR=0;
...
})();
(function init2(){//функция-обёртка 2
var JUST_A_VAR=0;//используется переменная с таким же именем, но она локальная только для этой функции, поэтому не имеет никакого отношения к переменной с таким же именем в прошлой функции
...
})();
function init() {
var JUST_A_VAR = 1;
alert(JUST_A_VAR);
}
function init2() {
var JUST_A_VAR = 2;
alert(JUST_A_VAR);
}
init3 = function () {
var JUST_A_VAR = 3;
alert(JUST_A_VAR);
};
init2();
init3();
init();
for (var i = 0, ii = arr.length; i < ii; ++i)
ii, jj, kk
во вложенных циклах удобнее, чем l, ll, lll
1) Про память — бред, если вам надо освободить память, напишите n = null; но НЕ ИСПОЛЬЗУЙТЕ одну переменную для разных целей, отлаживать замучаетесь
2) пример неудачный. Вместо того, чтобы ставить 100/1000 обработчиков onclick, лучше поставить один на родительском элементе.
Про события перетаскивания — эпический бред. Вы учли, что навеивание/снятие обработчика —это тоже обращение к ДОМу, перестроение внутренних структур данных в браузере, и если вы будет это делать с частотой 100 раз в секунду, это не очень правильно. Гораздо правильнее ждать нажатия кнопки мыши (начало перетаскивания) на нужном объекте, и при нажатии — ставить обработчик onmousemove, при отпускании — снимать.
Троттлить (ограничивать частоту вызова) стоит функцию onresize, так как когда юзер ресайзит окно, пересчитывается и перерисовывается вся страница, и если вы еще будете свои скрипты пересчитыать, это может убить отзывчивость браузера окончательно.
Эффект от нескольких сэкономленных переменных проявится более-менее заметно, если у вас десятки и сотни тысяч вызовов. Но делать рекурсию такой глубины — крайне глупое, неэффективное и непродуманное решение. У вас оверхед на вход/выход в функцию и расход памяти на стеке перевесит все оптимизации. От такой рекурсии надо избавляться.
(function init(){
COUNTER=0;
(function recourse(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,r1,s1,t1,u1,v1,w1,x1,y1,z1){//легкая шизофазия в виде 52-х локальных переменных
COUNTER++;
arguments.callee(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,r1,s1,t1,u1,v1,w1,x1,y1,z1);
});
})();
(function init(){
COUNTER=0;
var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,r1,s1,t1,u1,v1,w1,x1,y1,z1;
(function recourse(){
COUNTER++;
arguments.callee();
a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,r1,s1,t1,u1,v1,w1,x1,y1,z1;
})();
})();
Аргумент ф-и и локальная переменная — разные вещи, согласитесь?
function f(){
var a=arguments[0],
b=arguments[1],
c=arguments[2];
};
function f(a,b,c){
};
function f1(){
var a = arguments[0];
a = 123;
console.log( arguments[0] ); // 1
};
f1(1)
function f2(a){
a = 123;
console.log( arguments[0] ); // 123
};
f2(1);
...//для каждой переменной
var a=arguments[0];
delete arguments[0];//необходимо из-за отсутствия флага "настраиваемый"
Object.defineProperty(arguments,"0",{get:function(){return a;},set:function(v){a=v;}});
...
то получится ситуация, описанная вами.var a= [];
a.length= 50000;
for(var i=0,l=a.length; l>i; i+=1)
{
// ...
}
(function init(){
var x=document.getElementById("x");
var test=function test(fnc){
var d=new Date;
for(var i=0;i<10000;i+=1)
fnc();
alert(new Date()-d);
};
test(function yourfunc(){
//здесь ваш код который нужно сравнить с другим кодом по скорости
});
test(function yourfunc2(){
//здесь ваш код который нужно сравнить с другим кодом по скорости
});
})();
Если размер массива известен заранее, вполне может быть, что new Array(length) будет эффективней.
var times = 1000000, i, a;
console.time('index');
a = new Array(times);
for (i = times; i--;) a[i] = i; // 1237ms
console.timeEnd('index');
console.time('push');
a = [];
for (i = times; i--;) a.push(i); // 988ms
console.timeEnd('push');
Операции деления/умножения на числа, являющиеся степенью двойки
и на ней легко получить signed int32 overflow
JavaScript. Оптимизация: опыт, проверенный временем