Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么以下两段代码的运行方式如此不同?;_Javascript_Node.js_Google Chrome_V8 - Fatal编程技术网

Javascript 为什么以下两段代码的运行方式如此不同?;

Javascript 为什么以下两段代码的运行方式如此不同?;,javascript,node.js,google-chrome,v8,Javascript,Node.js,Google Chrome,V8,看看这两段代码,第二段只添加了第三行。但时间是84倍。谁能解释为什么 let LIMIT=9999999; 设arr=新阵列(限制); //arr.push(1); 控制台时间(“数组插入时间”); for(设i=1;i

看看这两段代码,第二段只添加了第三行。但时间是84倍。谁能解释为什么

let LIMIT=9999999;
设arr=新阵列(限制);
//arr.push(1);
控制台时间(“数组插入时间”);
for(设i=1;i
arr.push(1)
操作创建一个“稀疏”数组:它在索引
999999
处有一个元素。V8将这种稀疏数组的内部表示切换到“字典模式”,即数组的后备存储是索引→元素字典,因为这比仅使用一个元素时为1000万个元素分配空间要高效得多

另一方面,访问字典模式数组的元素(读或写)比访问“快速/密集模式”数组的元素慢:每次访问都必须计算正确的字典索引,并且(在当前场景中)字典必须增长几倍,这意味着将所有现有元素复制到新的备份存储

当阵列填满时,V8注意到它变得越来越密集,并在某个点将其转换回“快速/密集模式”。到那时,大部分减速已经被观察到。不过,循环的其余部分也增加了一些成本,因为此时,
arr[i]=i
store已经看到了两种类型的数组(字典模式和密集模式),因此在每次迭代中,它必须检测数组现在处于何种状态,并相应地进行处理,这(毫不奇怪)比不必做出决定花费更多的时间


概括结论:由于JavaScript具有动态性和灵活性,对于外观非常相似的代码段,引擎的行为可能会截然不同;例如,因为引擎优化了一种情况下的内存消耗,另一种情况下的执行速度,或者因为其中一种情况下允许它使用不适用于另一种情况的快捷方式(无论出于何种原因)。好消息是,在许多情况下,正确、易懂/直观/简单的代码也会运行得很好(在本例中,错误的
arr.push
看起来很像一个bug)。

发布代码,而不是代码的图片我看不到代码,也看不到图片非常感谢您的回复。我学到了很多。如果我将arr.push(1)替换为arr[LIMIT]=1,则代码运行缓慢。但是如果我把它放在arr[LIMIT-1]=1,这个数组看起来也是“稀疏”数组,但是它运行得很快。你能解释一下吗?期待您的回答。
arr[LIMIT-1]=1
可以使用现有的预分配备份存储,因此不会触发切换到字典模式。确定。非常感谢!!当一个答案回答了您的问题时,表示感谢的方式是将其标记为已接受,并有选择地向上投票:-)