性能 - 我应该同时使用数组和对象作为巨大的列表吗?

时间:2017-01-26 16:22:15

标签: javascript arrays performance object

到目前为止,我的服务器已经处理了实体的巨大数组

主要是,它在实体上执行 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)(内存浪费)?

- 继续使用数组

1 个答案:

答案 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])
        }
    }

}