有没有比使用嵌套循环更好的寻找解决方案的方法?

我希望根据包含的代码段中的嵌套循环加快测试所有组合的过程。


我目前在 Windows 10 上使用 JavaScript 和 NodeJS。


有没有办法使用 GPU 而不是 CPU 来计算这个?


var simulations = 0;

for (let i = 10; i <= 20; i++) {

    breakStepThree = i;

    for (let i = 8; i <= 12; i++) {

        historyLevelThree = i;

        for (let i = 0; i <= 60; i += 5) {

            rateLevelThree = i;

            for (let i = 10; i <= 16; i++) {

                breakStepTwo = i;

                for (let i = 6; i <= 10; i++) {

                    historyLevelTwo = i;

                    for (let i = 0; i <= 50; i += 5) {

                        rateLevelTwo = i;

                        for (let i = 10; i <= 14; i++) {

                            breakStepOne = i;

                            for (let i = 4; i <= 8; i++) {

                                historyLevelOne = i;

                                for (let i = 0; i <= 40; i += 5) {

                                    rateLevelOne = i;

                                    simulations++;

                                    console.log('testing combination '

                                        + rateLevelOne + ' ' + historyLevelOne + ' ' + breakStepOne + ' '

                                        + rateLevelTwo + ' ' + historyLevelTwo + ' ' + breakStepTwo + ' '

                                        + rateLevelThree + ' ' + historyLevelThree + ' ' + breakStepThree

                                    );

                                    console.log('performing test no ' + simulations);

                                }

                            }

                        }

                    }

                }

            }

        }

    }

}

尽我所能实施工作线程。


慕桂英3389331
浏览 164回答 3
3回答

Smart猫小萌

在 Node.js 中,我不知道有任何易于使用的 GPU。根据为测试每个组合所做的工作的性质和主机系统的特性,您可以使用内置的worker_threads和/或集群模块来分散工作。该worker_threads模块在进程中创建线程。该cluster模块创建单独的进程。

qq_笑_17

尽我所能实施工作线程。const {&nbsp; &nbsp; Worker, isMainThread, parentPort, workerData} = require('worker_threads');const os = require('os');if (isMainThread) {&nbsp; &nbsp; const startTime = Date.now();&nbsp; &nbsp; const workers = [];&nbsp; &nbsp; // const numberOfThreads = 1;&nbsp; &nbsp; const numberOfThreads = os.cpus().length;&nbsp; &nbsp; let completed = 0;&nbsp; &nbsp; let minBreakStep = 10;&nbsp; &nbsp; let maxBreakStep = 20;&nbsp; &nbsp; let minMaxElements = [];&nbsp; &nbsp; for (let i = minBreakStep; i <= maxBreakStep; i++) {&nbsp; &nbsp; &nbsp; &nbsp; minMaxElements.push(i);&nbsp; &nbsp; }&nbsp; &nbsp; const numberOfElements = minMaxElements.length;&nbsp; &nbsp; const numElementsPerThread = Math.ceil(numberOfElements / numberOfThreads);&nbsp; &nbsp; let workerIndex = 0;&nbsp; &nbsp; let allSimulations = 0;&nbsp; &nbsp; for (let i = minBreakStep; i <= maxBreakStep; i += numElementsPerThread) {&nbsp; &nbsp; &nbsp; &nbsp; let workerStart = i;&nbsp; &nbsp; &nbsp; &nbsp; let workerEnd = i + numElementsPerThread - 1;&nbsp; &nbsp; &nbsp; &nbsp; if (workerEnd > maxBreakStep) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; workerEnd = maxBreakStep&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; const worker = new Worker(__filename, {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; workerData: {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; workerIndex,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; workerStart,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; workerEnd,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; &nbsp; &nbsp; worker.on('message', (message) => {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (message.completed) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; completed++;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; console.log('worker ' + message.workerIndex + ' completed ' + message.simulations + ' simulations.');&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; allSimulations += message.simulations;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (completed === workers.length) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; console.log('Completed all ' + allSimulations + ' done!');&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; const endTime = Date.now();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; const elapsedTime = (endTime - startTime) / 1000;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; console.log(elapsedTime + ' second(s) to complete');&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; &nbsp; &nbsp; workerIndex++;&nbsp; &nbsp; &nbsp; &nbsp; workers.push(worker);&nbsp; &nbsp; }} else {&nbsp; &nbsp; let workerIndex = workerData.workerIndex;&nbsp; &nbsp; let workerStart = workerData.workerStart;&nbsp; &nbsp; let workerEnd = workerData.workerEnd;&nbsp; &nbsp; let simulations = 0;&nbsp; &nbsp; for (let i = workerStart; i <= workerEnd; i++) {&nbsp; &nbsp; &nbsp; &nbsp; breakStepThree = i;&nbsp; &nbsp; &nbsp; &nbsp; for (let i = 8; i <= 12; i++) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; historyLevelThree = i;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (let i = 0; i <= 60; i += 5) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rateLevelThree = i;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (let i = 10; i <= 16; i++) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; breakStepTwo = i;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (let i = 6; i <= 10; i++) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; historyLevelTwo = i;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (let i = 0; i <= 50; i += 5) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rateLevelTwo = i;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (let i = 10; i <= 14; i++) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; breakStepOne = i;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (let i = 4; i <= 8; i++) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; historyLevelOne = i;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (let i = 0; i <= 40; i += 5) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rateLevelOne = i;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; simulations++;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // console.log('testing combination '&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //&nbsp; &nbsp; &nbsp;+ rateLevelOne + ' ' + historyLevelOne + ' ' + breakStepOne + ' '&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //&nbsp; &nbsp; &nbsp;+ rateLevelTwo + ' ' + historyLevelTwo + ' ' + breakStepTwo + ' '&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //&nbsp; &nbsp; &nbsp;+ rateLevelThree + ' ' + historyLevelThree + ' ' + breakStepThree&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // );&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // console.log('performing test no ' + simulations);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; console.log('testing completed');&nbsp; &nbsp; parentPort.postMessage({&nbsp; &nbsp; &nbsp; &nbsp; completed: true,&nbsp; &nbsp; &nbsp; &nbsp; workerIndex: workerIndex,&nbsp; &nbsp; &nbsp; &nbsp; simulations: simulations,&nbsp; &nbsp; });}

慕姐8265434

例如,您可以使用 CUDA 绑定在 GPU 上执行计算。也许在这种情况下,连接 C 程序并导入/导出实验设计和结果会更好。此外,我将使用如下所示的方法摆脱所有这些嵌套循环。为了性能起见,可能会去掉切片,并检查参数,因为下面的几行只是为了理解这个想法。class ExperimentGenerator{  let pointer = 0;  const initialParams = [0,0,0,0,0,0,0,0];  let params = [...initialParams]  const maxValue = [10,10,10,10,10,10,10,10]  nextExperiment = () =>{     if(params[pointer] >= maxValue[pointer]){         pointer++;         //Reset all other parameters         params = [initialParams.slice(0,pointer),params[pointer],initialParams.slice(pointer)];     }     params[pointer]++;     return params;  }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript