资讯专栏INFORMATION COLUMN

Javascript里面最常用的6种查找字符串的方式——以及它们的性能测试

graf / 1873人阅读

摘要:在字符串中搜索子字符串,是最基本的操作之一,我们经常会遇到,我通常做的是,查看代码中的其他地方,看看其他人都做了什么,然后做同样的事情现在,我只是想提出一些最常用的选项,以及它们之间的性能比较,以防您关心性能,以便当涉及到将来的选择时,您知

在字符串中搜索子字符串,是最基本的操作之一,我们经常会遇到,我通常做的是,查看代码中的其他地方,看看其他人都做了什么,然后做同样的事情!现在,我只是想提出一些最常用的选项,以及它们之间的性能比较,以防您关心性能,以便当涉及到将来的选择时,您知道哪一个是更好的选择!
代码展示

下面是我在搜索字符串时经常看到的6种不同的方法:

// 1. includes (introduced in ES6) 
var string = "string to search for substring",
    substring = "sea";
string.includes(substring);

// 2. RegExp: test
var string = "string to search for substring",
    expr = /sea/;  // no quotes here
expr.test(string);

//3. string.search
var string = "string to search for substring",
    expr = "/sea/";
string.search(expr);

//4. lodash: includes
var string = "string to search for substring",
    substring = "sea";
_.includes(string, substring);

// 5. string.match
var string = "string to search for substring",
    expr = "/sea/";
string.match(expr);

// 3. string.indexOf
var string = "string to search for substring",
    substring = "sea";
string.indexOf(substring) !== -1;
性能基准测试

如果你想知道,给出一个一般长度的字符串,哪个会表现得更好,regex.test是最快的,其次是string.search(libraries by ES6),第三位属于string.indexof方法:


前往测试页面 →

如果放大测试字符串的规模会怎么样?

我缩放这个字符串,把它放大1000倍(100万字符,甚至1000万字符),我看到string.indexof是一个赢家,虽然不是很多!
下面这是我的基准测试的结果,我创建了1~1000万个字符的字符串来进行测试
基准测试非常大的字符串,并重复子字符串1000次:

前往测试页面 →
译者注:这个链接提供的测试内容感觉跟作者描述的测试内容不符,可能链接是错的

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/110307.html

相关文章

  • 【读书笔记】《高性能JavaScript

    摘要:性能访问字面量和局部变量的速度是最快的,访问数组和对象成员相对较慢变量标识符解析过程搜索执行环境的作用域链,查找同名标识符。建议将全局变量存储到局部变量,加快读写速度。优化建议将常用的跨作用域变量存储到局部变量,然后直接访问局部变量。 缺陷 这本书是2010年出版的,这本书谈性能是有时效性的,现在马上就2018年了,这几年前端发展的速度是飞快的,书里面还有一些内容考虑IE6、7、8的东...

    chengjianhua 评论0 收藏0
  • 前端性能优化指南

    摘要:前端性能优化指南优化缓存异步并不等于即时。操作性能问题主要有以下原因。发生在之前,所以相对来说会造成更多性能损耗。新引擎还对对象属性访问做了优化,解决方案叫,简称。代价是前置的扫描类型编译优化。数组,,闭包变量不在优化范畴之列。 前端性能优化指南 AJAX优化 缓存AJAX: 异步并不等于即时。 请求使用GET: 当使用XMLHttpRequest时,而URL长度不到2K...

    Pink 评论0 收藏0
  • API

    摘要:是一个极度纯净的上传插件,通过简单调整就可以融入到任何项目,支持多文件上传上传速率动态控制真实进度监控分块生成分块上传校验秒传暂停取消等。 跨域学习笔记 前言: 当一个资源,向与之所在服务器不同的域或端口请求另一个资源时,这个HTTP请求,我们认为是跨域的请求。出于安全考虑,浏览器会限制脚本发起的跨域HTTP请求。 那天后端让我把token放到http请求头字段里,说是为了和RN端统一...

    lsxiao 评论0 收藏0
  • 读书笔记(03) - 性能 - JavaScript高级程序设计

    摘要:作用域链查找作用域链的查找是逐层向上查找。而全局变量和闭包则会与之相反,继续保存,所以使用用后需手动标记清除,以免造成内存泄漏。获取元素的属性获取元素的属性等参考文档高级程序设计作者以乐之名本文原创,有不当的地方欢迎指出。 showImg(https://segmentfault.com/img/bVburXV?w=500&h=399); 作用域链查找 作用域链的查找是逐层向上查找。查...

    warnerwu 评论0 收藏0
  • 《高性能javascript》阅读摘要

    摘要:当执行上下文被创建时,它的作用域链初始化为当前运行函数的属性中的对象。该过程搜索执行环境的作用域链,查找同名的标识符。搜索实例成员比从字面量或局部变量中读取数据代价更高,再加上遍历原型链带来的开销,这让性能问题更为严重。 最近在阅读这本Nicholas C.Zakas(javascript高级程序设计作者)写的最佳实践、性能优化类的书。记录下主要知识。 加载和执行 脚本位置 放在中的...

    duan199226 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<