Долгое время работы блока nodejs



  • Есть кусок кода который выполняется очень долго.
    Суть этого участка кода в проверки уникальности используемого прокси.
    Screenshot_4.jpg
    Код из кубика nodejs

    startP = new Date().getTime();
    let proxies = JSON.parse([[PROXY_CONTENT]]);
    endP = new Date().getTime();
    console.log(`parse: ${endP - startP}ms`);
    
    //console.log(proxies);
    
    function filterByIp(arr, ip) {
        return arr.filter(function(item, i, arr) {
            return (item.real_ip == ip);
        });
    };
    
    function getRandomInt(min, max) {
        min = Math.ceil(min);
        max = Math.floor(max);
        return Math.floor(Math.random() * (max - min)) + min; //Максимум не включается, минимум включается
    }
    
    function getProxy(random = false){
        let used_ips = [[USED_IPS]];
        let proxy = false;
        if(random){
            start = new Date().getTime();
            if(used_ips.length){
                used_ips.forEach(function(item, i, arr) {
                    //console.log(item);
                    old_proxy = filterByIp(proxies, item.real_ip);
                    if(old_proxy.length){
                        proxy = old_proxy[0];
                        return;
                    }
                })
            }
            end = new Date().getTime();
            console.log(`used_ips: ${end - start}ms`);
        }
    
        if(!proxy) {
            start = new Date().getTime();
            let proxyIndex = getRandomInt(0, proxies.length);
            //console.log('proxyIndex '+proxyIndex);
            proxy = proxies[proxyIndex];
            end = new Date().getTime();
            console.log(`random proxy: ${end - start}ms`);
        }
    
        let block_ips = [[BLOCK_IPS]];
        if(block_ips.length){
            start = new Date().getTime();
            let block_ip_check = false;
            block_ips.forEach(function(item, i, arr) {
                //console.log(item);
                if(item.ip == proxy.real_ip){
                    block_ip_check = true;
                    return;
                }
            })
            end = new Date().getTime();
            console.log(`block_ips: ${end - start}ms`);
            console.log('block_ip_check '+block_ip_check);
            if(block_ip_check){
                return getProxy(false)
            }
        }
    
        let all_used_ips = [[ALL_USED_IPS]];
        if(all_used_ips.length){
            start = new Date().getTime();
            let all_used_check = false;
            all_used_ips.forEach(function(item, i, arr) {
                //console.log(item);
                if(item.real_ip == proxy.real_ip){
                    all_used_check = true;
                    return;
                }
            })
            end = new Date().getTime();
            console.log(`all_used_ips: ${end - start}ms`);
            console.log('all_used_check '+all_used_check);
            if(all_used_check){
                return getProxy(false)
            }
        }
    
        return proxy;
    }
    start1 = new Date().getTime();
    [[PROXY_OBJECT]] = getProxy(true);
    end1 = new Date().getTime();
    console.log(`all: ${end1 - start1}ms`);
    
    console.log('getProxy');
    [[BLOCK_IPS]] = [[ALL_USED_IPS]] = [[USED_IPS]] = '';
    

    Вообщем что мы видим в итоге в консоле

    [394756266] [15:39:21] Поток №1 : parse: 18ms
    [394756266] [15:39:22] Поток №1 : used_ips: 2ms
    [394756266] [15:39:22] Поток №1 : block_ips: 0ms
    [394756266] [15:39:22] Поток №1 : block_ip_check false
    [394756266] [15:39:22] Поток №1 : all_used_ips: 1ms
    [394756266] [15:39:22] Поток №1 : all_used_check true
    [394756266] [15:39:22] Поток №1 : random proxy: 0ms
    [394756266] [15:39:22] Поток №1 : block_ips: 0ms
    [394756266] [15:39:22] Поток №1 : block_ip_check false
    [394756266] [15:39:22] Поток №1 : all_used_ips: 0ms
    [394756266] [15:39:22] Поток №1 : all_used_check false
    [394756266] [15:39:22] Поток №1 : all: 3ms
    [394756266] [15:39:22] Поток №1 : getProxy
    [465490379] [15:39:22] Поток №1 : 33043 ms
    [546491848] [15:39:22] Поток №1 : Замер времени
    

    Таким образом получается что все замеры в самом блоке это all + parse = 21 мс
    А реальное время работы состовляет 33043 мс

    Я понимаю что там огромные массивы данных сравниваются для вычисления уникального ip но почему такая большая разница во времени внутри блока и за его пределами.



  • Только сейчас удалось решить эти проблему

    Как понял проблема была из за того что у меня данные получались из базы в выше стоящем блоке а их там было не сколько десятков тысяч.
    И вот при предаче их в блок где происходили проверки, и возникали все эти тормаза.
    Как только я объединил все блоки получения данных из базы с блоком проверок, то время которое не обходимо сразу же стало в рамках разумного сейча где то 4-6 сек, а не 30-60
    как это было раньше.


Log in to reply