javascript(node.js)代码效率使用性能优化方法

时间:2016-11-01 21:19:25

标签: javascript node.js ecmascript-6

以下是具有大约1000个属性的元数据文件,并且很可能在不久的将来会增长更多。

metadata.js

exports = module.exports = Object.freeze({
  '12345': {
    'name': 'xyz',
    'value': 'pqr',
    'message': 'abc',
    'link': 'http',
    'desc': 'long'
  },
  .
  .
  ...
});

这是执行逻辑,

的script.js

    const itemList = require('./metadata');

    method1()
      .then((res) =>
         method2(Object.keys(itemList))
      )
      .then((res) => {
        const data = [];
        res.forEach((element) => {
          data.push({
            'name': itemList[element.itemid].name,
            'value': element.lastvalue,
            'desc': itemList[element.itemid].desc,
          });
        });
        console.log(JSON.stringify(data, null, 2));
        return method3(data);
      })
      .then((res) => console.log(res))
      .catch((err) => console.log(err));

method1和method2代码

const rp = require('request-promise-native');

class Client {
  ...
  postRequest (method, params) {

    return new Promise((resolve, reject) => {

      rp({
        'method': 'POST',
        'uri': this.url,
        'json': true,
        'resolveWithFullResponse': true,
        'body': {
          'jsonrpc': '2.0',
          'id': this.rpcid += 1,
          'auth': this.authid,
          method,
          params
        }
      })
        .then((res) => {

          if (res.statusCode === 200 && typeof res.body !== 'undefined') {

            resolve(res.body);

          }
          reject(res.body);

        })
        .catch((err) => reject(err));

    });

  }

  method1 () {

    return new Promise((resolve, reject) => {

      const method = 'user.login';
      const params = {
        'user': this.user,
        'password': this.password
      };

      this.postRequest(method, params)
        .then((res) => {

          if (res.result) {

            this.authid = res.result;
            resolve(res.result);

          }
          reject(res);

        })
        .catch((err) => reject(err));

    });

  }

  method2 (itemids) {

    return new Promise((resolve, reject) => {

      const method = 'item.get';
      const params = {
        itemids,
        'webitems': true,
        'output': ['itemid', 'lastvalue']
      };

      this.postRequest(method, params)
        .then((res) => {

          if (res.result) {

            resolve(res.result);

          }
          reject(res);

        })
        .catch((err) => reject(err));

    });

  }
}

exports = module.exports = Client;

method3代码

const rp = require('request-promise-native');

class Client {
  ...
  postRequest (baseurl, body) {

    return new Promise((resolve, reject) => {

      rp({
        'method': 'POST',
        'uri': `${this.url}/${this.version}${baseurl}`,
        'json': true,
        'simple': false,
        'resolveWithFullResponse': true,
        body
      })
      .then((res) => resolve(res))
      .catch((err) => reject(err));

    });

  }

  method3 (arr) {

    return new Promise((resolve, reject) => {

      const baseurl = '/blah/blah';

      this.postRequest(baseurl, arr)
         .then((res) => {

           if (res.statusCode === 200) {

             resolve(`${res.body.status} done`);

           }

           reject(res);

         })
         .catch((err) => reject(err));

    });

  }
}

module.exports = Client;

这似乎对我来说很好,但整个执行过程需要60多秒才能完成。我想知道是否可以使用一些更有效的方法重写此代码可能使用Map()for而不是forEach或其他任何内容。请建议。

节点版本:v6.9.1

1 个答案:

答案 0 :(得分:-1)

你可以做的几件事;

  1. 使用lodash/underscore而不是本机方法,因为lodash / underscores函数由引擎内联并加速(v8)。
  2. 使用流程库进行并行处理(如async或Promise.all)因为你不需要方法1的结果tod do method2
  3. 此外,使用map而不是foreach,以防止数据阵列增长并强制引擎创建新数组并复制内容(或确保数据初始化为正确大小的数组)
  4. 最后,请确保您的console.log&当您衡量绩效时,JSON.stringify不会被执行