Testes de desempenho
Visite jackgiffin.com para testes de desempenho
O código
Bem, para uma coisa eu escreveria todo o HTML de uma só vez. Outra coisa é que eu usaria insertAdjacentHTML para que os ouvintes de eventos atuais e outras partes virtuais do conteúdo atual do corpo não sejam removidos. Então, usando esta e várias outras micro-otimizações, eu triplicou o desempenho do seu código (no chrome, pelo menos). A função otimizada a seguir preserva a maior parte das funcionalidades da sua funcionalidade original.
let currentRound = -1;
MakeDateRange = function( beginText, endText, __func ){
'use-strict';
const t = performance.now();
let begin = new Date(beginText), end = new Date(endText),
curRound = 'z' + ++currentRound,
len = ((end.getTime()-begin.getTime())/86400000)|0,
i = -1,
bodyHTML = '',
dates;
if (__func instanceof Function){
while (i++ !== len)
begin.setDate(begin.getDate()+1), bodyHTML += __func(begin, curRound);
document.body.insertAdjacentHTML('beforeend',bodyHTML);
perfs[1] = (performance.now()-t );
return document.getElementsByName(curRound);
}
dates = new Array(len);
while (i++ !== len)
begin.setDate(begin.getDate()+1), dates[len] = new Date(begin);
perfs[1] = (performance.now()-t );
return dates;
};
dates = MakeDateRange(
"2015 2 1 0:0:0 GMT+0100",
"2016 2 1 0:0:0 GMT+0100" ,
function(date, curRound){ return '<div name='+curRound+'>'+date+'</div>' }
);
console.log(dates);
No entanto, se você inserir __func
, será ainda mais rápido:
let currentRound = -1;
MakeDateRange = function( beginText, endText ){
'use-strict';
const t = performance.now();
let begin = new Date(beginText), end = new Date(endText),
curRound = 'z' + ++currentRound,
template = '<div name="' + curRound + '">',
len = ((end.getTime()-begin.getTime())/86400000)|0,
i = -1,
bodyHTML = '',
dates;
while (++i !== len)
begin.setDate(begin.getDate()+1), bodyHTML += template + begin + '</div>';
document.body.insertAdjacentHTML('beforeend',bodyHTML);
perfs[2] = (performance.now()-t );
return document.getElementsByName(curRound);
};
dates = MakeDateRange(
"2015 2 1 0:0:0 GMT+0100",
"2016 2 1 0:0:0 GMT+0100"
);
console.log(dates);
Além disso, recomendo usar let
e const
em vez de var
porque performance.now
está disponível desde o IE10 e let
e const
estão disponíveis desde o IE11. O IE10 só pode ser obtido através de atualizações específicas do Windows 7. E, a maioria dos usuários do Windows não tem atualizações instaladas, o que significa IE9, ou, muito mais comumente, todas as atualizações do Windows instaladas, o que significaria IE11. É improvável que qualquer usuário do Windows 7 com as atualizações corretas para o IE10 visite seu site, assim você pode também usar o IE11.