javascript - 为什么这个 Javascript 数组访问这么慢?
问题描述
我有一个 5000 个元素的数组 ( frames_to_boxes
)。每个元素本身都是一个 Box 类的对象数组:
class Box {
constructor(x, y, width, height, frame, object_class, id) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
this.frame = frame;
this.object_class = object_class;
this.id = id;
}
frames_to_boxes
按帧索引。的目的frames_to_boxes
是使用它按帧号查找 Box,而不是扫描我的 yuuuge 数组并检查帧是否相等。但是,我没有得到我期望的表现;frames_to_boxes
根据我的性能分析,检查某个特定元素是否为 null 大约需要 25 毫秒。这对我来说似乎是错误的。
这是我的分析方式:
const t11 = performance.now();
if(this.frames_to_boxes[i] != null)
{
const t12 = performance.now();
在我的控制台日志中,我打印出差异(t12-t11)
,它显示从 5 毫秒到 25 毫秒。该数组以 3 个为一组进行访问(即检查索引 500、501、502),似乎第一次访问通常在 25 毫秒左右,而接下来的两次访问在 5 毫秒左右。如果有区别,this.frames_to_boxes
是一个 Vue 计算值;但是,从我的性能跟踪和日志记录来看,我已经确认要更新的代码frames_to_boxes
没有被重新执行。似乎数组查找负责计时。
这种类型的操作需要 5-25 毫秒吗?如果不是,我的表现缓慢可能是什么原因造成的?我的性能数据来自 Chrome。
解决方案
我试图在不使用 Vue 的情况下创建一个最小的可重现示例,问题就消失了。这给了我一个提示,虽然frames_to_boxes
没有重新计算,但似乎 Vue 引擎正在检查更改的依赖项或类似的东西。
在将Object.freeze
Box 元素插入主数组之前应用它们可以解决问题,并且现在检查 null 所需的时间少于预期的 1 毫秒。
推荐阅读
- jakarta-ee - 刷新 Payara 中的 Hazelcast 缓存
- javascript - Firebase 仅查询我参与的文档
- java - 三元运算行为怪异
- sql-server - T-SQL 查询将多列更改为按日期分组的单列
- wordpress - Wordpress 无法向 Office 365 电子邮件 ID 发送电子邮件
- android - 滚动ScrollView android上的显示和隐藏按钮
- javascript - 在 express.js 中处理 post 请求
- android - java.lang.IllegalStateException:找不到所需的视图 - 黄油刀有时不工作
- python - 像 Twitter 上的连锁店一样吸引追随者的追随者
- typescript - 将对象键作为通用传递