【问题标题】:NodeJS async/await performance issueNodeJS 异步/等待性能问题
【发布时间】:2020-04-14 08:47:35
【问题描述】:

我正在尝试使用 NodeJS/rally-node 提取过去 24 小时的 Rally 修订历史记录。

Obj 层次结构是:用户故事 -> 修订历史 -> 修订

我可以正确获得结果,但 10 个用户故事需要 35 秒。我在这里嵌入了我的示例代码。任何人请帮助我如何提高性能!

谢谢! 孙达拉詹 R


示例代码:

'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;

【问题讨论】:

    标签: javascript node.js async-await rally


    【解决方案1】:

    一种可能的优化是使用Promise.all 并行而不是串行获取它们:

    编辑:为了比“获取它们”更具体,我的意思是先执行第一个查询 - 因为后面的查询依赖于它 - 然后并行执行所有“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);
            }
        }
    

    【讨论】:

    • 嗨,杰克,感谢您的 cmets。我无法并行运行 3 个 API 调用,因为它们都是相互依赖的。 1. 拉取用户故事 2. 用户故事的修订历史 3. 修订 ID 的修订
    • 这个解决方案本质上运行以下伪代码:series(queryUserStory(),parallel(series(queryUserRevisionHistory(),queryUserRevisions()) for each result))。这不是你所追求的吗?看起来所有“用户故事的修订历史”都依赖于“拉用户故事”,但彼此不依赖?
    • 嗨,杰克,很抱歉延迟回复。你能帮我解决串联/并联的问题吗,我是新手。我怎样才能最好地利用它?
    猜你喜欢
    • 1970-01-01
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    相关资源
    最近更新 更多