JavaScript:CPU缓存预取以及确定数据下直接更改数组length的好处

news2025/2/11 7:01:10

CPU缓存预取以及确定数据下直接更改数组length的好处

  • 1. CPU 缓存预取(Cache Preloading):
    • CPU 缓存预取:
    • 为什么反向填充栈能利用缓存预取:
  • 2. 为什么可以直接改变数组的 length:
    • 数组的动态长度:
      • 为什么可以直接改变 length:
    • 性能考虑:
  • 总结:

1. CPU 缓存预取(Cache Preloading):

在这段代码中,findFSTNodeByDataName 使用了一个 stack 数组来存储待处理的节点,并且通过反向填充栈来优化性能,特别是在 CPU 缓存的使用上。

const stack = new Array(payload.length);
let stackIdx = payload.length;

// 反向填充初始栈(利用 CPU 缓存预取)
for (let i = 0; i < payload.length; i++) {
  stack[i] = payload[i];
}

CPU 缓存预取:

  • 在现代计算机中,CPU 会使用缓存(例如 L1/L2 缓存)来提高内存访问速度。访问较远的内存地址(比如跨越不同缓存块的数据)可能会导致较慢的访问速度。为了提高效率,CPU 会预取(预加载)一些内存块,提前将它们加载到缓存中,以减少等待时间。

为什么反向填充栈能利用缓存预取:

  • 由于 stack[i] = payload[i] 是顺序访问数组的元素,而数组通常是按顺序存储在内存中的(尤其是在大数组或一维数组中)。访问内存时,CPU 会预取接下来的内存区域,因为数组的内存是线性分布的。因此,在这个循环中,填充栈的过程本身会触发CPU预取操作,使得数据在栈上被预加载,后续的栈操作就能更高效地访问这些数据。
  • 更进一步,现代 JavaScript 引擎和操作系统会在物理内存中对数据进行布局优化,使得连续的内存区域更有可能被缓存(如数组元素连续存储在内存中)。通过反向填充(从栈顶往下填充),代码可能更好地利用了 CPU 的预取机制,提高了内存访问的效率。

2. 为什么可以直接改变数组的 length:

在这段代码中,当栈中某个节点有子节点时,代码改变了 stack 数组的 length:

const children = node.children;
if (children?.length) {
  const childLen = children.length;
  stack.length = stackIdx + childLen;  // 改变数组长度
  for (let j = 0; j < childLen; j++) {
    stack[stackIdx + j] = children[j];
  }
  stackIdx += childLen;
}

数组的动态长度:

  • 在 JavaScript 中,数组的 length 是一个动态属性,你可以随时通过设置 length 来扩展或收缩数组。当你设置 stack.length = stackIdx + childLen 时,实际上是调整了数组的大小,使它容纳更多的元素。需要注意的是,改变数组 length 只会影响已分配的数组内存(对于扩展数组会重新分配内存)。

为什么可以直接改变 length:

  • JavaScript 数组是动态的,它们可以按需增加或缩小。虽然 length 是一个特殊的属性,但它与数组的元素存储是分开的。这使得在访问数组元素时,设置 length 会自动调整数组的大小,且这种操作不需要手动分配新的内存。JavaScript 引擎内部会自动管理数组内存的重新分配或收缩。
  • 在这段代码中,stack.length = stackIdx + childLen 是为了将栈的长度调整到适应当前子节点的数量。这种做法与使用 push 或 unshift 添加元素相比,性能上会更高。通过直接设置 length,数组的内存布局会被调整,以便为新元素腾出空间。更重要的是,length 的操作不会导致 push 的隐式内存分配和元素复制过程。

性能考虑:

  • 当你直接设置 length 时,相比 push 或 unshift,通常会避免不必要的内存重新分配和复制,尤其是在元素的数量已知或变化可控的情况下。这种方式避免了多次进行内存扩容操作,提高了性能。

总结:

1.	CPU 缓存预取:通过反向填充栈,可以利用 CPU 的预取机制,提高内存访问效率。这种方法优化了内存布局,避免了频繁的随机内存访问,提高了缓存命中率。
2.	直接改变 length 的原因:在 JavaScript 中,数组的 length 可以直接修改,它是一个动态的属性。修改 length 不需要进行数组的复制或其他操作,因此相比 push 等方法,能更高效地调整数组的大小,避免了不必要的内存分配和数据复制。

这种技术的组合方式(使用反向填充和调整数组 length)可以帮助提升性能,尤其是在处理大量数据时,减少内存分配和复制的开销,进而提高算法效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2296192.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Selenium常用自动化函数

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:数据库 JavaEE专栏:JavaEE 软件测试专栏:软件测试 关注博主带你了解更多知识 目录 1.元素的定位 1.1 定位步骤 1,要想定位,就先打开开发者工具 2,先点击左上角图标 1.2 cssSelector 1.3 xpath 2.操作测…

【故障排除】ls: command not found 终端命令失效的解决办法

【TroubleShooting】ls: command not found 终端命令失效的解决办法 A Solution to Solve “Command not found” of Terminal on Mac 一直在使用心爱的MacBook Pro的Terminal&#xff0c;并且为她定制了不同的Profile。 这样&#xff0c;看起来她可以在不同季节&#xff0c…

12.翻转、对称二叉树,二叉树的深度

反转二叉树 递归写法 很简单 class Solution { public:TreeNode* invertTree(TreeNode* root) {if(rootnullptr)return root;TreeNode* tmp;tmproot->left;root->leftroot->right;root->righttmp;invertTree(root->left);invertTree(root->right);return …

数字孪生智慧停车管理可视化平台

采用图扑可视化技术搭建智慧停车管理平台&#xff0c;实现了全面的数据整合与实时监控&#xff0c;提升了停车场运营效率和用户体验。通过 HT 可视化界面&#xff0c;管理者能够实时观察和分析停车位使用情况&#xff0c;进行精准调度与优化决策。

win10 llamafactory模型微调相关②

微调 使用微调神器LLaMA-Factory轻松改变大语言模型的自我认知_llamafactory 自我认知-CSDN博客 【大模型微调】使用Llama Factory实现中文llama3微调_哔哩哔哩_bilibili 样本数据集 &#xff08;数据集管理脚本处需更改&#xff0c;见报错解决参考1&#xff09; 自我认知微…

车载测试工具 --- CANoe VH6501 进行Not Acknowledge (NAck) 测试

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…

使用 AlexNet 实现图片分类 | PyTorch 深度学习实战

前一篇文章&#xff0c;CNN 卷积神经网络处理图片任务 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 本篇文章内容来自于 强化学习必修课&#xff1a;引领人工智能新时代【梗直哥瞿炜】 使用 AlexNet 实现图片分类…

Linux系统引导与服务管理

目录 一、Linux引导过程 1、引导过程概述 1.1、BIOS开机自检 1.2、MBR读取 1.3、加载引导加载程序&#xff08;GRUB&#xff09; 1.4、内核加载 1.5、初始化进程&#xff08;init&#xff09; 二、服务 2.1、服务类型 2.2、服务管理工具 三、运行级别 四、systemd …

【Hadoop】大数据权限管理工具Ranger2.1.0编译

目录 ​编辑一、下载 ranger源码并编译 二、报错信息 报错1 报错2 报错3 报错4 一、下载 ranger源码并编译 ranger官网 https://ranger.apache.org/download.html 由于Ranger不提供二进制安装包&#xff0c;故需要maven编译。安装其它依赖&#xff1a; yum install gcc …

C++ 使用CURL开源库实现Http/Https的get/post请求进行字串和文件传输

CURL开源库介绍 CURL 是一个功能强大的开源库&#xff0c;用于在各种平台上进行网络数据传输。它支持众多的网络协议&#xff0c;像 HTTP、HTTPS、FTP、SMTP 等&#xff0c;能让开发者方便地在程序里实现与远程服务器的通信。 CURL 可以在 Windows、Linux、macOS 等多种操作系…

探店小程序:解锁商业新生态,定制未来

在数字化浪潮席卷全球的今天&#xff0c;商业的边界正在被重新定义。随着移动互联网技术的飞速发展&#xff0c;探店小程序作为一种新兴的商业模式&#xff0c;正以其独特的优势迅速成为连接商家与消费者的桥梁。我们刚刚为一家客户成功交付了一款集分销、分润、商业模式定制开…

【人工智能】如何在VSCode中使用DeepSeek?

文章目录 前言一、准备工作二、安装DeepSeek插件步骤1、扩展图标搜索DeepSeep2、安装DeepSeek插件3、使用测试DeepSeekBito文心一言 结论 前言 介绍在VSCode中调用DeepSeek插件工具&#xff0c;可以进行对话、编码。 一、准备工作 确保已经安装好了VSCode软件。 二、安装D…

机器学习 - 进一步理解最大似然估计和高斯分布的关系

一、高斯分布得到的是一个概率吗&#xff1f; 高斯分布&#xff08;也称为正态分布&#xff09;描述的是随机变量在某范围内取值的概率分布情况。其概率密度函数&#xff08;PDF&#xff09;为&#xff1a; 其中&#xff0c;μ 是均值&#xff0c;σ 是标准差。 需要注意的是…

Office/WPS接入DeepSeek等多个AI工具,开启办公新模式!

在现代职场中&#xff0c;Office办公套件已成为工作和学习的必备工具&#xff0c;其功能强大但复杂&#xff0c;熟练掌握需要系统的学习。为了简化操作&#xff0c;使每个人都能轻松使用各种功能&#xff0c;市场上涌现出各类办公插件。这些插件不仅提升了用户体验&#xff0c;…

如何在Android Studio中开发一个简单的Android应用?

Android Studio是开发Android应用的官方集成开发环境&#xff08;IDE&#xff09;&#xff0c;它提供了许多强大的功能&#xff0c;使得开发者能够高效地创建Android应用。如果你是Android开发的初学者&#xff0c;本文将引导你如何在Android Studio中开发一个简单的Android应用…

第40天:Web开发-JS应用VueJS框架Vite构建启动打包渲染XSS源码泄露代码审计

#知识点 1、安全开发-VueJS-搭建启动&打包安全 2、安全开发-VueJS-源码泄漏&代码审计 一、Vue搭建创建项目启动项目 1、Vue 框架搭建->基于nodejs搭建&#xff0c;安装nodejs即可 参考&#xff1a;https://cn.vuejs.org/ 已安装18.3或更高版本的Node.js 2、Vue 创建…

[数据结构] Set的使用与注意事项

目录 Set的说明 常见方法说明 注意事项 TreeSet使用案例 Set的说明 Set与Map主要的不同有两点: Set是继承自Collection的接口类,Set中只存储了Key. 常见方法说明 方法解释boolean add(E e)添加元素,但重复元素不会被添加成功void clear()清空集合boolean contains(Object…

安当SLA操作系统登录双因素认证:全方位保障Windows系统登录安全

一、产品概述 在当今数字化时代&#xff0c;Windows系统面临着诸多安全挑战&#xff0c;如弱口令问题等。安当SLA&#xff08;System Login Agent&#xff09;作为一款强大的双因素登录认证产品&#xff0c;通过支持OTP动态口令和USBKey硬件令牌认证&#xff0c;有效解决多种W…

操作系统|ARM和X86的区别,存储,指令集

文章目录 主频寄存器寄存器在硬件中的体现是什么寄存器的基本特性硬件实现寄存器类型 内存和寄存器的区别内存&#xff08;Memory&#xff09;和磁盘&#xff08;Disk&#xff09;指令的执行ARM Cortex-M3与Thumb-2指令集Thumb-2 与流水线虚拟地址指令的执行 多核CPU芯片间的通…

Mp4视频播放机无法播放视频-批量修改视频分辨率(帧宽、帧高)

背景 家人有一台夏新多功能 视频播放器(夏新多功能 视频播放器),用来播放广场舞。下载了一些广场舞视频, 只有部分视频可以播放,其他视频均无法播放,判断应该不是帧速率和数据速率的限制, 分析可能是播放器不支持帧高度大于720的视频。由于视频文件较多,需要借助视频编…