到目前为止,我的服务器已经处理了实体的巨大数组。
主要是,它在实体上执行 for循环 每秒x次,检查一个实体是否在另一个实体的范围内(通过 entitiesInScope.indexOf(entity),每个实体都有一个数组 entitiesInScope ),这是我程序的最大成本。
for (var i = 0; i < entities.length; i++) {
var entity = entities[i];
for (var j = 0; j < entities.length; j++) {
var checkEntity = entities[j];
var idx = entity.entitiesInScope.indexOf(checkEntity);
if (idx >= 0) {
if (!check(checkEntity.state, entity.state)) {
entity.removeEntityInScope(idx);
//... remove: send checkEntity.id
}
} else {
if (check(checkEntity.state, entity.state)) {
entity.addEntityInScope(checkEntity);
//... add: send checkEntity.id, checkEntity.state
}
}
}
}
(我通过不对所有实体进行第二次循环来优化它,但这不是重点)
但是,我发现Object的 hasOwnProperty 比indexOf更much faster。另一方面,我也做了很多推动和拼接。所以如果我添加一个Object实体,我也应该使用delete(perf?)。
我应该:
- 添加一个带有id实体键的对象,使用hasOwnProperty(entity.id),然后允许使用indexOf,如果为true?
-add一个带有实体键的对象,使用hasOwnProperty(entity.id)(内存浪费)?
- 继续使用数组
答案 0 :(得分:1)
我建议迭代使用entitiesInScope来更新或删除那里的实体,因为你已经知道索引,如果你向后遍历它,你可以删除项目而不会搞乱索引。
至于添加缺失的实体,我会将对象中已经存在的实体标记为快速查找,然后迭代实体并添加缺失的实体。代码与此类似:
for (var i = 0; i < entities.length; i++) {
var entity = entities[i];
var alreadyInScope = {}
for (var j = entity.entitiesInScope.length - 1; j >= 0; j--) {
var checkEntity = entity.entitiesInScope[j];
if (!check(checkEntity.state, entity.state)) {
var id = entity.entitiesInScope.splice(j, 1).id
} else {
alreadyInScope[checkEntity.id] = true;
}
}
for (var j = 0; j < entities.length; j++) {
if (alreadyInScope.hasOwnProperty(entities[j].id) == false) {
entity.entitiesInScope.push(entities[j])
}
}
}