您知道在Node.js中实现消耗更少内存的模型层的最佳方法是什么?我认为有这些选择:
一个类(业务对象)的唯一实例,其中包含一组创建,更新,删除,读取等特定实体的方法。
// 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){
});
具有许多实例的常用方法的类:
// 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){
//...
});
我怀疑内存消耗,因为在第一种方法中,只有一个类的实例处理控制层和数据库中的数据;而在第二种方法中,可能存在同一类的许多实例(100个用户同时注册),尽管一个好处可能是更全面的OOP。
感谢。
答案 0 :(得分:1)
我不明白你的第一个主张。您正在将对象实例传递给new
。如果您的对象不需要多个实例,则不需要构造函数。你应该按照
{{1}}
声明一个函数会占用内存,但数量可以忽略不计。但更重要的是,在这种情况下拥有构造函数并没有多大意义,如果我为您的代码做出贡献,我可能会为了理智而改变它。
至于你的第二个命题,使用带有构造函数的对象并使用{{1}}关键字为你创建的每个文档创建实例,这对于这样的实现来说肯定更常见。但是,它可能会消耗更多内存,因为您正在创建同一对象的许多实例。例如,您接收JSON,将其解析为对象,然后将该对象传递给构造函数,从而使用模型和文档中的继承方法和属性构造实例。但是,再次,这是可以忽略不计的内存增加量,因为JavaScript是通过引用传递的。
我不明白为什么你会担心这种情况下的内存使用情况。在这种情况下,你不太可能做很多事情来大幅减少内存消耗。最终,完全忽视OOP并且只是创建过程代码可能是最有效的,尽管它将是非常难以管理的,它可能具有最小的内存占用。虽然这完全是我的观点,但您应该写出最有意义的,而不是消耗最少的内存。从长远来看,为减少内存占用而做出的任何微小改动都可能会产生相反的效果,因为对象并没有真正占用大量内存。
100个用户每次传递30bytes的用户名和密码,等于~10kb(标题和JSON中的其他字符)。如果您正在使用具有少量内存的系统,那么您应该考虑使用一种语言,您可以使用这种语言显式管理内存并使用静态类型(C,C ++,Java)。更不用说nodejs的并发模型并不完全意味着100个请求同时进入,nodejs将同时处理这100个请求,其中一些可能会响应并在其他请求开始之前被垃圾收集被处理。