Несколько встроенных циклов в NodeJS

Мне нравится выполнять следующий код... но, как вы можете видеть, потребуется 10 миллиардов циклов! Поэтому мне было интересно - что вы, ребята, предложили бы ускорить его?

Причина - мне нужно, чтобы "грубая сила" достигла наилучшего результата, - это потому, что самый внутренний метод выполняет сложный расчет некоторых исторических данных - около 7 миллионов строк из БД... и точка делает все это - найти наилучшую "настройку" данных параметров af..., которая дает лучший результат...

var a = 0.1;

while(a <= 10) // 100
{
    var b = 0.1;

    while(b <= 10) // 100
    {
        var c = 0.1;

        while(c <= 10) // 100
        {
            var d = 0.1;

            while(d <= 10) // 100
            {
                var e = 1;

                while(e <= 10) // 10
                {
                    var f = 1;

                    while(f <= 10) // 10 10.000.000.000
                    {
                        // Call at method which use all parameters and return the result of a given calculation
                        //doSomeThing(a,b,c,d,e,f);
                        f += 1;
                    }
                    e += 1;
                }
                d += 0.1;
            }
            c += 0.1;
        }
        b += 0.1;
    }
    a += 0.1;
}

Ответ 1

Разбейте петли на более мелкие куски и процессы вилки, используя основной модуль кластера, обрабатывая каждый меньший кусок в вилке. Вилки будут работать на отдельных потоках, лучше используя процессор.

https://nodejs.org/api/cluster.html#cluster_how_it_works

UPDATE. Хорошо, не используйте кластер. Вместо этого используйте модуль потоков - это будет намного проще. https://www.npmjs.com/package/threads...

var cores = require('os').cpus().length;
var Pool = require('threads').Pool; 
var pool = new Pool(cores);

var doSomeThing = pool.run(function(data,done){
    var result = data.a * data.b * data.c * data.d * data.e * data.f;
    done(result,data);
})


var a = 0.1;
var b = 0.1;
var c = 0.1;
var d = 0.1;
var e = 0.1;
var f = 0.1;


while(a <= 10) // 100 loops
{
    while(b <= 10) // 100 loops
    {
        while(c <= 10) // 100 loops
        {
            while(d <= 10) // 100 loops
            {
                while(e <= 10) // 10 loops
                {
                    while(f <= 10) // 10 loops
                    {
                        // Call at method which use all parameters and return the result of a given calculation
                        doSomeThing.send({a:a,b:b,c:c,d:d,e:e,f:f});
                        f += 0.1;
                    }
                    e += 0.1;
                }
                d += 0.1;
            }
            c += 0.1;
        }
        b += 1;
    }
    a += 1;
}

pool
  .on('error', function(job, error) {
    console.error('Job errored:', job);
  })
  .on('finished', function() {
    console.log('Everything done, shutting down the thread pool.');
    pool.killAll();
  });