Огромное снижение производительности с ASYNC / AWAIT - PullRequest
0 голосов
/ 15 января 2019

Я пишу аддон C ++ с Node.js, и я сделал асинхронную функцию, я попробовал это с обратным вызовом и с Promise. Для выполнения обратного вызова потребовалось от 300 мс до 1000 мс, в то время как для Promise потребовалось от 1800 мс до 5000 мс для одной и той же работы.

Аддон использует алгоритм Minmax с процессом принятия решений Маркова, чтобы решить ход в игре по соединению четыре. Код следующий:

Обратный вызов:

socket.on('play', row => {
    console.time('play');
    play(socket, Game, row);
    Game.minimax(AImove => {
        play(socket, Game, AImove - 1);
        console.timeEnd('play');
    });
 });
/*
*  play: 1170.922ms
*  play: 984.421ms
*  play: 1324.559ms
*  play: 1147.240ms
*/

АСИНХРОННЫЙ / ЖДУТ:

const minimax = Game => {
  return new Promise(resolve => {
    Game.minimax(AImove => {
      resolve(AImove);
    });
  });
};

socket.on('play', async row => {
    console.time('play');
    play(socket, Game, row);
    const AImove = await minimax(Game);
    play(socket, Game, AImove - 1);
    console.timeEnd('play');
  });
/*
*  play: 1838.339ms
*  play: 3204.243ms
*  play: 3245.432ms
*  play: 4590.880ms
*/

Я выполнил ту же самую последовательность ходов, плохая практика - писать ASYNC / AWAIT с аддоном узла Или я что-то не так сделал?

1 Ответ

0 голосов
/ 15 января 2019

Обычно, когда я вижу функцию Promise или асинхронную функцию, выполнение которой занимает много времени, это происходит потому, что функция не возвращает значение в конце. Он будет проходить до конца функции без возврата, и только по таймауту. Кроме того, вложение Обещаний - плохая практика.

...