如何在Node.js中实现消耗较少内存的模型层?

时间:2015-10-09 02:32:49

标签: node.js

您知道在Node.js中实现消耗更少内存的模型层的最佳方法是什么?我认为有这些选择:

  1. 一个类(业务对象)的唯一实例,其中包含一组创建,更新,删除,读取等特定实体的方法。

    // UserModel.js
    
    var User = function() {
        this.create = function(data, callback){};
        this.delete = function(id, callback){};
        this.read = function(id, callback){};
        this.update = function(id, data, callback){};
        this.list = function(data, callback){};
    }
    
    module.exports = new User();
    
    // UserController.js
    
    User = require('UserModel');
    
    User.create({
        username : 'xxx', 
        password : 'yyy'
    },function(err, user){
    
    });
    
  2. 具有许多实例的常用方法的类:

    // UserModel.js
    
    var User = function(data){
       this.data = data;
       this.save = function(callback){};
       this.update = function(callback){};
       this.delete = function(callback){};
    }
    
    User.prototype.list = function(){};
    User.prototype.getById = function(){};
    
    module.exports = User;
    
    // UserController.js 
    
    var User = require('UserModel');
    
    var user = new User({
        username : 'xxx',
        password : 'yyy'
    });
    
    user.save(function(err){
      //...
    });
    
  3. 我怀疑内存消耗,因为在第一种方法中,只有一个类的实例处理控制层和数据库中的数据;而在第二种方法中,可能存在同一类的许多实例(100个用户同时注册),尽管一个好处可能是更全面的OOP。

    感谢。

1 个答案:

答案 0 :(得分:1)

我不明白你的第一个主张。您正在将对象实例传递给new。如果您的对象不需要多个实例,则不需要构造函数。你应该按照

的方式定义一些东西
{{1}}

声明一个函数会占用内存,但数量可以忽略不计。但更重要的是,在这种情况下拥有构造函数并没有多大意义,如果我为您的代码做出贡献,我可能会为了理智而改变它。

至于你的第二个命题,使用带有构造函数的对象并使用{{1}}关键字为你创建的每个文档创建实例,这对于这样的实现来说肯定更常见。但是,它可能会消耗更多内存,因为您正在创建同一对象的许多实例。例如,您接收JSON,将其解析为对象,然后将该对象传递给构造函数,从而使用模型和文档中的继承方法和属性构造实例。但是,再次,这是可以忽略不计的内存增加量,因为JavaScript是通过引用传递的。

我不明白为什么你会担心这种情况下的内存使用情况。在这种情况下,你不太可能做很多事情来大幅减少内存消耗。最终,完全忽视OOP并且只是创建过程代码可能是最有效的,尽管它将是非常难以管理的,它可能具有最小的内存占用。虽然这完全是我的观点,但您应该写出最有意义的,而不是消耗最少的内存。从长远来看,为减少内存占用而做出的任何微小改动都可能会产生相反的效果,因为对象并没有真正占用大量内存。

100个用户每次传递30bytes的用户名和密码,等于~10kb(标题和JSON中的其他字符)。如果您正在使用具有少量内存的系统,那么您应该考虑使用一种语言,您可以使用这种语言显式管理内存并使用静态类型(C,C ++,Java)。更不用说nodejs的并发模型并不完全意味着100个请求同时进入,nodejs将同时处理这100个请求,其中一些可能会响应并在其他请求开始之前被垃圾收集被处理。