如何提高扩展运算符的性能

博客地址:https://github.com/Wscats/articles/issues/88

在这篇文章中,我们会进行一个有趣的测试,看看我们如何提高扩展运算符的性能。

让我们首先简要介绍一下扩展运算符在数组中的工作原理。

扩展运算符,也就是我们常用的三个,让数组展开变成每个小块。 然后使用中括号语法[],重新组装这些小块构造一个新数组。

扩展运算符可以被放置在中括号[]里面的任何位置。

const numbers = [1, 2, 3];
[0, ...numbers];    // => [0, 1, 2, 3]
[0, ...numbers, 4]; // => [0, 1, 2, 3, 4]
[...numbers, 4];    // => [1, 2, 3, 4]

回答我们一开始提出的问题,扩展运算符在数组文字中的位置是否可以提高性能?让我们往后继续探究。

附加到头部和尾部功能

在开始性能比较之前,让我们定义两个函数。

第一个是appendToTail()

function appendToTail(item, array) {
  return [...array, item];
}

const numbers = [1, 2, 3];
appendToTail(10, numbers); // => [1, 2, 3, 10]

appendToTail()可以让你在数组的末尾插入一个值。 此函数使用了以下写法[...array, item]

第二个是appendToHead()

function appendToHead(item, array) {
  return [item, ...array];
}

const numbers = [1, 2, 3];
appendToHead(10, numbers); // => [10, 1, 2, 3]

appendToHead()是一个纯函数,它返回一个新数组,其中添加的值是插入在原数组的头部。它使用[item, ...array]

讲道理就上面这两个函数的表现,没有理由认为这些功能会有不一样的效率。但是事实可能跟我们想象中不一样,下面让我们来继续测试吧。

性能测试

我用MacBook Pro在以下3个浏览器的笔记本电脑上测试[... array, item][item, ...array],对比两者的性能:

  • Chrome 76
  • Firefox 68
  • Safari 12.1

以下是性能测试结果:

正如预期的那样,在Firefox和Safari浏览器中[...array, item][item, ...array]具有相同的性能。

但是,在Chrome中,[...array, item]的执行速度比[item, ...array]快两倍。 这是一个有用的结果。

要在Chrome中提高扩展运算符的性能,请在数组文字的开头使用扩展运算符:

const result = [...array, item];

但另一个问题出现了:这种问题怎么引起的?

从V8引擎的7.2版本之后,为Chrome中的JavaScript执行提供支持,可以对扩展运算符进行新的优化:快速路径优化

用几句话描述它的工作原理,如下:

如果没有这个优化,当引擎遇到扩展运算符[...iterable, item]时,它会调用可迭代对象的迭代器iterator.next()。在每次迭代时,结果数组的内存都会增加,迭代结果会被添加到结果数组中。

但是快速路径优化检测到已知的可迭代(如整数数组)并完全跳过迭代器对象的创建。 然后引擎读取扩展数组的长度,仅为结果数组分配一次内存。 然后通过索引传播数组,将每个项目添加到结果数组中。

快速路径优化会跳过迭代对象的创建,只为结果分配一次内存。 从而性能提高。

支持的数据结构

快速路径优化适用于以下标准JavaScript数据结构。

数组

const numbers = [1, 2, 3, 4];

[...numbers, 5]; // => [1, 2, 3, 4, 5]

字符串

const message = 'Hi';

[...message, '!']; // => ['H', 'i', '!']

Sets

const colors = new Set(['blue', 'white']);

[...colors, 'green'];          // => ['blue', 'white', 'green']
[...colors.values(), 'green']; // => ['blue', 'white', 'green']
[...colors.keys(), 'green'];   // => ['blue', 'white', 'green']

Maps

在Map对象中,仅支持map.keys()map.values()方法:

const names = new Map([[5, 'five'], [7, 'seven']]);

[...names.values(), 'ten']; // => ['five', 'seven', 'ten']
[...names.keys(), 10];      // => [5, 7, 10]

结论

当被扩展的数组位于数组的开头时,由于快速路径优化,您可以获得性能提升。它适用于V8引擎7.2版本(Chrome v72和NodeJS v12附带的特性)。

通过此优化,性能测试显示[... array, item]的执行速度至少比[item, ...array]快两倍。

请注意,虽然快速路径确实很有用,建议您在性能很重要或者处理大型数组的地方使用它。

因为,在大多数情况下,强制优化,最终用户很可能不会感觉到任何差异。

您还知道JavaScript中有哪些有趣的性能优化,可以在下面评论中告诉我?

如果文章能带您一丝帮助或者启发,请不要吝啬你的赞和Star,对我是前进的动力和最大的肯定??

原文地址:https://www.cnblogs.com/enoy/p/12020169.html

时间: 2024-10-13 12:35:31

如何提高扩展运算符的性能的相关文章

提高C#质量与性能

这篇随笔,用来记录提高C#质量和性能的方法. 基本 使用字符串应避免两种性能开销. 1.确保尽量少的装箱:值类型转换引用类型,会进行装箱操作.但是值类型的ToString(),是非托管方法,直接操作内存进行转换.故此不会进行装箱操作.9.ToString() 性能高于 string s = 9; 2.避免分配额外的内存空间:因字符串不可变性,对字符串进行任何操作或运算都会创建新对象,需要分配新的内存空间.使用常量进行+ 拼接,不会分配内存空间.尽量使用StringBuilder.string.F

如何提高PHP应用的性能

如何提高PHP应用的性能 1. 如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍.       2.$row['id']的速度是$row[id]的7倍.       3.echo 比 print快,并且使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接,比如echo$str1,$str2.       4.在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替.       5.注销那些不用的变量尤其是大数组,

通过硬件层提高Android动画的性能

曾有许多人问我为什么在他们开发的应用中,动画的性能表现都很差.对于这类问题,我往往会问他们:你们有尝试过在硬件层解决动画的性能问题么? 我们都知道,在播放动画的过程中View在每一帧动画的显示时重绘自身.但如果你使用 View layer,使得View被渲染一次后就放到一个屏幕外的缓冲区中(即 layer),让View不断被重用,而不是一次又一次的重绘的话,这类动画性能问题就迎刃而解了. 此外,硬件层对图像的处理都会在GPU上进行缓存,使得我们在播放动画的过程中对View的特定操作的执行效率更高

day46homework常量字符串拼接结构赋值扩展运算符for-of循环map函数默认值

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>01定义常量.html</title> <!--常量--> <script> //常量:1.一旦定义 不能更改 const PI = 3.14;  // console.log(PI); // PI = 3.1415; error 

... 扩展运算符

1  含义 扩展运算符( spread )是三个点(...).它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列. [javascript] view plain copy console.log(...[1, 2, 3]) // 1 2 3 console.log(1, ...[2, 3, 4], 5) // 1 2 3 4 5 [...document.querySelectorAll('div')] // [<div>, <div>, <div>]

使用Zend OpCache 提高 PHP 5.5+ 性能

使用Zend OpCache 提高 PHP 5.5+ 性能 作者:admin | 时间:February 28, 2015 | 分类:Linux | 评论:1 评论 PHP 5.5 以后内建了 OpCache ,我们启用即可 OpCache 的加速原理是把编译后的 bytecode 存储在内存里面, 避免重复编译 PHP 所造成的资源浪费. 虽然内建了, 但是默认没有启用: 军哥lnmp Ubuntu 14.04 nginx1.6.2 mariadb5.5.41 php5.6.5 修改 php.

关于扩展运算符中i++和++i,以及基本类型和引用类型的综合应用

首先说一下扩展运算符中的i++和++i i++和++i在单独使用的时候是一样的. var i=1; //i++; //console.log(i);//2 ++i console.log(i);//2 但是当它参与其他运算是就会发生改变 var i=1;var b=i++ + i++ + i++;//2+3+4 console.log(i);//4 console.log(b)//9 所以总结一下关于i++和++i,即i++是在加号前面,所以向赋值在加1,而++i是先运算再赋值 下面这个案例会涉

Dreamweaver扩展及JavaScript性能调优

Dreamweaver曾经辉煌过,部分开发人员还在使用,毕竟十年前的技术了,不做深入研究.我打算对Dreamweaver扩展和JavaScript开发做一些整理. 主要内容: 1. 开发Extension的注意事项 2. 如何在Extension里面启动并调用JVM 3. 开发自己的工具 4. JavaScript性能调优 扩展开发注意事项 扩展(Extension),是应用程序给用户预留的二次开发接口.Dreamweaver提供了对菜单,插入栏(Insert),浮动框等GUI部件的扩展支持,使

ES6 rest参数和扩展运算符

rest参数 ES6引入了rest参数(形式为“…变量名”).其中rest参数搭配的变量是一个数组可以使用数组的一切操作. 例: function rest(...values){ let sum=0; for(var val of values){ sum+=val; } return sum; } add(1,2,3)//6 值得注意的是rest参数之后不能再有其他参数(只能是最后一个参数)否则会报错. 例: function rest(a,...b,c){ }//报错 函数的length属