我必须用很多对象填充一个array.我目前的实现是这样的:

let useVertices = [];
const len = this.indices.length;
for(let i = 0; i < len; i++){
    let index = this.indices[i]*3;
    useVertices.push(new THREE.Vector3(
        this.vertices[index],
        this.vertices[index+1], 
        this.vertices[index+2])
    );
}

this.indices是一个长度接近400万的Int32array. this.vertices是一个长度约为650,000的Float32array.

上面所示的实现需要500到800 ms.

我使用的浏览器是CefSharp,因为该网站是在C#应用程序中运行的.

有没有可能提高这个代码的速度?

推荐答案

收集我的think条 comments 中的最佳建议(除了框架挑战),等待你测试它们:

  • Ouroborus pointed out,因为你有4M个索引,但只有650k个顶点,你经常会创建等价的THREE.Vector3个实例.我们可以重新使用实例,记住以前基于index的实例.
  • Gabriele Petrioli pointed out可以使用赋值而不是push,保存方法调用:useVertices[i] = ___
  • 您可以使用new Array(len)预分配数组
  • 通过缓存indicesverticesTHREE.Vector3避免不必要的属性查找
  • 如果可以的话,用const代替useVertices
const { indices, vertices } = this;
const V = THREE.Vector3;
const len = indices.length;
const useVertices = new Array(len);
const vectors = new Map(); // For reusing vectors
for (let i = 0; i < len; i++) {
    let index = indices[i] * 3;
    let vector = vectors.get(index);
    if (!vector) {
        vector = new V(
            vertices[index],
            vertices[index + 1],
            vertices[index + 2]
        );
        vectors.set(index, vector);
    }
    useVertices[i] = vector;
}

(注意:Plat00ntry 使用数组而不是上面的Map,但即使使用getset方法调用,Map也更快.)

Javascript相关问答推荐

JavaScript文本区域阻止KeyDown/KeyUp事件本身上的Alt GR +键组合

是什么原因导致此Angular 16应用程序中类型错误时属性结果不存在?

仅圆角的甜甜圈图表

Google Apps脚本中的discord邀请API响应的日期解析问题

无法在nextjs应用程序中通过id从mongoDB删除'

html + java script!需要帮助来了解为什么我得到(无效的用户名或密码)

使用JQuery单击元素从新弹出窗口获取值

如何发送从REST Api收到的PNG数据响应

在数组中查找重叠对象并仅返回那些重叠对象

为什么云存储中的文件不能公开使用?

使用类型:assets资源 /资源&时,webpack的配置对象&无效

Node.js API-queryAll()中的MarkLogic数据移动

每隔3个项目交替显示,然后每1个项目交替显示

将Singleton实例设置为未定义后的Angular 变量引用持久性行为

如何将字符串拆分成单词并跟踪每个单词的索引(在原始字符串中)?

如何在Web项目中同步语音合成和文本 colored颜色 更改

如何使pdf.js上的文本呈现为可选?

Rails 7:在不使用导入映射的情况下导入Java脚本

如何在函数组件中保留对计时器的引用

如何让noWrap在嵌套在Alert/AlertTitle组件中的排版组件中工作?