技术解析

JavaScript 变量创建 所对应的内存值连续吗
0
1975-03-01 06:35:03
idczone
比如我
情况 a
let a = 1
let b = 2
这样是连续的嘛
情况 b
let a = 1
let b = {name:'mafeifei'}
情况 c
let a= 1
setTimeout(()=>{var b =2 },0)
这得看具体引擎实现吧,变量在内存中的分布我猜标准里没有规定。

不能说不连续,但肯定不是 c 语言那样

比如 v8 引擎

之前有个帖子
疑惑来自于这里
https://v2ex.com/t/781924

JS 因为抽象程度比较高,本身是一个比较“反机器”的语言,所以经常被人比作走得很慢的“乌龟”。
但 V8 经常被人比作“火箭”,这俩结合起来就是“火箭带着乌龟飞”。
为什么 V8 可以带着 JS 飞起来,甚至性能直逼 Java 这种编译型语言?
主要是因为 V8 搞了大量奇淫技巧,通过各种动态调整来加速 JS 程序的执行。
我举个栗子,很多排序算法都有最坏情况,如果我只写死用一种算法的话,遇到最坏情况性能就很差了,但我完全可以写多种算法,要排序的时候先自动判断一下数据是什么特征,然后再动态选择一种最适合的算法来排序,那么整个程序在任何情况下都有不错的性能。(当然 V8 里排序不是这么做的,V8 里用的是 Timsort 进行排序的,这个也算是一种动态决策的复合排序算法)
JS 里的一个数据结构,在 V8 里可能是会动态改变数据结构和位置的,V8 开发者会分析各种场景,然后分别做出最佳的方案,让 V8 时刻监控程序当前处于什么状态,以随时决定是否要动态调整数据结构、算法,来最大限度提升性能,以及少吃点内存。
所以分析 JS 在 V8 上运行时候的内存情况,可能意义不大,因为这个不是固定的,同时对于复杂程序来说近乎于混沌状态,只能相信 V8 开发者都做好了优化。
另一方面来说,硬件、操作系统、V8 引擎、JS 每一层都有自己的“Memory”调度机制,层与层之间都是有抽象的,如果你关心的操作系统上的内存调度情况,你只能看到 V8 的数据,看不到 JS 的数据。

贴子白看了……

谢谢大佬科普~

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服