Dicas para otimizar o código javascript. um ano de datas

5

Estou brincando com o objeto date, criei uma função que gera várias datas e aplica algumas funções em cada data.

Por um mês, vale cerca de 2,5ms no meu pc, ff e chrome, mas por um ano ele é terrivelmente lento, 17-50ms, não previsível.

Isso me fez pensar, o que estou fazendo de errado, por que a imprevisibilidade?

O que você faria diferente, ao criar dinamicamente um período de tempo de data e hora?

function MakeDateRange( begin, end, __func )
{
    begin = new Date(begin);
    end   = new Date(end);

    var len  =((end.getTime()-begin.getTime())/86400000)|0,
        i = 0,
        t = performance.now(),
        dates = [];

    __func = __func || function( date )
    {
        return new Date(date);
    }
    for(i; i <= len; i++)
    {
        dates.push(__func(begin));
        begin.setDate(begin.getDate()+1);
    }

    document.body.innerHTML += (performance.now()-t )+"<br />";
    return dates;
}


var dates = MakeDateRange( "2015 2 1 0:0:0 GMT+0100", "2016 2 1 0:0:0 GMT+0100" , function(date){

    var no = document.body.appendChild(document.createElement("div"));
        no.innerHTML = date;
    return no
});
    
por MeganFoxObama 06.12.2015 / 07:05
fonte

1 resposta

2

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.

    
por 10.07.2017 / 01:34
fonte