在创建一个类时是否会有很大的性能损失与坚持所需模块的单一性质?

问题描述 投票:1回答:2

我正在构建MVC结构化项目的模型层。我正在研究下面列出的两个解决方案 - 以及每个请求实例化一个新类的性能。

(如果其他人有另一种模式推荐,我愿意接受)

独生子

const MySQLConnection = require("../configs/mysql");

// Get a session
module.exports.getSession = async (sessionToken) => {    
    // Check the DB
    const queryString = "SELECT * FROM `session` WHERE `session_token` = ?";
    const queryData = [sessionToken];
    return MySQLConnection.query(queryString, queryData);
};

// Create a session
module.exports.createSession = async (userID, sessionToken, ipAddress, browserName, browserVersion, platform) => {      
    // Check the DB
    const queryString = "INSERT INTO `session`  (user_id,session_token, ip_address, browser_name, browser_version, platform) VALUES (?,?,?,?,?,?)";
    const queryData = [userId, sessionToken, ipAddress, browserName, browserVersion, platform];
    return MySQLConnection.query(queryString, queryData);

};

// Expire a session
module.exports.expireSession = async (sessionToken) => {
    ...
};

基于类

const MySQLConnection = require("../configs/mysql");

module.exports = class Session {

    constructor(options) {
        this.userId = options.userId || defaults.userId;
        this.sessiontoken = sessiontoken.name || sessiontoken.name;
   }

    // Get session
    getSession() {              
        // Check the DB
        const queryString = "SELECT * FROM `session` WHERE `session_token` = ?";
        const queryData = [sessionToken];
        return MySQLConnection.query(queryString, queryData);
    }

    // Create session
    createSession() {
        // Check the DB
        const queryString = "INSERT INTO `session`  (user_id,session_token, ip_address, browser_name, browser_version, platform) VALUES (?,?,?,?,?,?)";
        const queryData = [userId, sessionToken, ipAddress, browserName, browserVersion, platform];
        return MySQLConnection.query(queryString, queryData);
    }
};

单身就像这样调用:

const SessionModel = require("../models/session");
const sessionResult = SessionModel.getSession("sj8f9dsafyh9sfafs");

该类将被调用如下:

const SessionModel = require("../models/session");
const session = new SessionModel({sessionToken: "sj8f9dsafyh9sfafs"})
const sessionResult = session.getSession();

单例不会在每个请求中创建一个新对象,而类会这样做。我希望能够在某处存储模型相关数据(并且不会影响同时发出请求的其他用户)。有没有更好的方法呢?

javascript node.js performance singleton
2个回答
0
投票

我的看法:我真的怀疑你会看到一个有意义的表现。

差异更多地取决于模块的功能。如果您需要一个允许您创建独立实例的工厂,请采用基于类的方法(在我们获得所有类的花哨之前,您可以使用函数执行此操作)。

如果你不这样做,我不会过于复杂,只需构建你的module.exports一个成员一次。


0
投票

我针对配置运行了负载测试仪(炮兵)。第一个比较是最佳情况(低行数),第二个是最坏情况(高行数)。

类比单身人士慢10%左右。

最佳案例:

独生子

Summary report @ 13:34:36(-0600) 2018-01-02
  Scenarios launched:  600
  Scenarios completed: 600
  Requests completed:  600
  RPS sent: 19.71
  Request latency:
    min: 4.9
    max: 22
    median: 5.9
    p95: 8.2
    p99: 9.8
  Scenario duration:
    min: 5.7
    max: 52
    median: 7
    p95: 9.4
    p99: 11.4
  Scenario counts:
    0: 600 (100%)
  Codes:
    200: 600

Summary report @ 13:38:08(-0600) 2018-01-02
  Scenarios launched:  600
  Scenarios completed: 600
  Requests completed:  600
  RPS sent: 19.7
  Request latency:
    min: 4.9
    max: 18.3
    median: 6.1
    p95: 8.3
    p99: 10
  Scenario duration:
    min: 5.6
    max: 37.1
    median: 7.2
    p95: 9.7
    p99: 12.2
  Scenario counts:
    0: 600 (100%)
  Codes:
    200: 600

最糟糕的情况

独生子

Summary report @ 13:51:35(-0600) 2018-01-02
  Scenarios launched:  600
  Scenarios completed: 600
  Requests completed:  600
  RPS sent: 19.71
  Request latency:
    min: 5
    max: 19.3
    median: 6.9
    p95: 9.1
    p99: 10.6
  Scenario duration:
    min: 5.9
    max: 44.5
    median: 8.1
    p95: 10.5
    p99: 12.5
  Scenario counts:
    0: 600 (100%)
  Codes:
    200: 600

Summary report @ 13:41:18(-0600) 2018-01-02
  Scenarios launched:  600
  Scenarios completed: 600
  Requests completed:  600
  RPS sent: 19.71
  Request latency:
    min: 4.9
    max: 42.9
    median: 7.2
    p95: 9.6
    p99: 12.1
  Scenario duration:
    min: 5.7
    max: 69
    median: 8.4
    p95: 11.2
    p99: 14.2
  Scenario counts:
    0: 600 (100%)
  Codes:
    200: 600
© www.soinside.com 2019 - 2024. All rights reserved.