NodeJS Асинхронное / ожидание проблемы с производительностью - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь получить историю Rally Revision за последние 24 часа, используя NodeJS / rally-node.

Иерархия Obj: Пользовательская история -> История изменений -> Ревизии

Я мог бы получить результаты правильно, но это займет 35 секунд для 10 пользовательских историй. Я вставил свой пример кода здесь. Любой, пожалуйста, помогите мне, как я могу улучшить производительность!

Спасибо! Сундарраджан Р


Код образца:

'use strict'
let rally = require('rally');
let queryUtils = rally.util.query;

const restApi = rally({
  apiKey: 'XXXXXXXXXXXX',
  apiVersion: 'v2.0',
  server: 'https://rally1.rallydev.com'
});

async function queryUserRevisions(revisions) {

  const params = {
    ref: revisions,
    start: 1,
    limit: 3,
    order: 'RevisionNumber DESC',
    fetch: ['RevisionNumber', 'Description', 'CreationDate', 'User']
  };

  return restApi.query(params);
}

async function queryUserRevisionHistory(RevisionHistory) {

  const params = {
    ref: RevisionHistory,
    start: 1,
    limit: 1,
    fetch: ['Revisions']
  }

  return restApi.query(params);
}

async function traceRevisions() {

  const startTime = new Date()
  let UserStories;
  let resultArray = [];

  const ts = last24Hours();

  const params = {
    type: 'hierarchicalrequirement',
    start: 1,
    pageSize: 200,
    limit: 100,
    order: 'FormattedID',
    fetch: ['Name', 'FormattedID', 'RevisionHistory'],
    query: queryUtils.where('LastUpdateDate ', '>', '2020-04-13T00:00Z'),
    scope: {
      workspace: '/workspace/11111111111',
      project: '/project/22222222222',
      up: false,
      down: true
    }
  };

  try {
    let response_one = await restApi.query(params);
    const UserStoryCount = response_one.Results.length;

    for (let i = 0; i < UserStoryCount; i++) {
      UserStories = response_one.Results[i];
      console.log(UserStories.FormattedID);

      let response_two = await queryUserRevisionHistory(UserStories.RevisionHistory)
      let response_three = await queryUserRevisions(response_two.Revisions);

      for (let j = 0; j < response_three.Results.length; j++) {
        let revision = response_three.Results[j];

        resultArray.push({
          FormattedID: UserStories.FormattedID,
          RevisionNumber: revision.RevisionNumber,
          Description: revision.Description,
          CreationDate: revision.CreationDate,
          UserName: revision.User._refObjectName
        });

      }
    }

    var endTime = new Date() - startTime;
    console.log('Execution time: %dms', endTime);
    return JSON.stringify(resultArray)

  } catch (error) {
    console.log(error);
  }
}

module.exports.traceRevisions = traceRevisions;

1 Ответ

0 голосов
/ 14 апреля 2020

Одной из возможных оптимизаций будет выборка их параллельно, а не последовательно, используя Promise.all:

РЕДАКТИРОВАТЬ: чтобы быть более точным c, чем «выбрать их», я имею в виду сделать сначала запрос сначала - потому что последующие зависят от него - а затем выполняют все цепочки «queryUserRevisionHistory, затем queryUserRevisions» параллельно друг другу.

    async function traceRevisions() {

        ...

        try {
            let response_one = await restApi.query(params);

            let resultArrays = await Promise.all( response_one.Results.map( async UserStories => {

                console.log(UserStories.FormattedID);

                let response_two = await queryUserRevisionHistory(UserStories.RevisionHistory)
                let response_three = await queryUserRevisions(response_two.Revisions);

                return response_three.Results.map( revision => ({
                    FormattedID: UserStories.FormattedID,
                    RevisionNumber: revision.RevisionNumber,
                    Description: revision.Description,
                    CreationDate: revision.CreationDate,
                    UserName: revision.User._refObjectName
                }));
            }));

            let resultArray = [].concat( ...resultArrays );

            var endTime = new Date() - startTime;
            console.log('Execution time: %dms', endTime);
            return JSON.stringify(resultArray)

        } catch (error) {
            console.log(error);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...