js数组查找最接近_在JavaScript数组中找到最小元素的位置

在JavaScript数组中找到最小元素的位置

注*  之前有篇文章介绍过数据遍历的性能比较: for in 比for loop慢至少20倍 ,这是另外一篇比较数组查找性能的例子,通过对手工/indexOf/reduce三者的比较,再次映证,内置函数不一下比手工写的函数快。

今天的小程序甚至不是一个程序。这只是一个函数。

问题陈述如下:给定一个非空的JavaScript数字数组,找到最小值的索引。(如果最小值出现不止一次,那么任何此类索引是可以接受的。)

一个解决方案是进行简单的手动操作,模拟用纸笔如何执行操作:首先,你假设第一个元素是赢家,然后你遍历其他元素。如果你的下一个元素小于第一个元素,那么你声明这个元素是新的临时的赢家。function indexOfSmallest(a) {

var lowest = 0;

for (var i = 1; i 

if (a[i] 

}

return lowest;

}

另一种解决方案是使用reduce内联函数本质来运行循环,所以你只需要提供初始猜测和if语句的业务逻辑。function indexOfSmallest(a) {

return a.reduce(function(lowest, next, index) {

return next 

0);

}

第三个解决方案是使用JavaScript 内联函数找到最小的元素,然后将元素转换为其索引。function indexOfSmallest(a) {

return a.indexOf(Math.min.apply(Math, a));

}

哪一个最快呢?

好吧,首先,你确定哪一个是最快之前,您需要确保他们都是正确的。你发现的一件事是,一旦数组变得很大最小/索引技术会失败,至少它在IE浏览器和Firefox上是这样的。(在我的例子中,Internet Explorer和Firefox分别放弃了元素数量约为250000和500000的数组)。那是因为你开始触及引擎的数量限制参数,这个参数你可以传递给一个函数。调用250000个元素的数组相当于最少调用250000个函数参数。所以我们会限制自己的数组长度最多为250000。分享结果之前,我想让你猜猜哪个算法你认为将是最快和哪个是最慢的。

仍然在等。

我预计手工版本是最后一名,因为,毕竟,这是手工做的一切。我预计使用减少函数的版本稍快,因为它把一些工作交给了内联函数(尽管上面的函数调用可能否定了它的改进)。我预计min/ indexOf版本是最快的,因为几乎所有的工作在内联函数中完成,并且两次数据遍历的开销将会由内联函数的一些改进性能构成。

这里有三个版本在不同大小的数组上的计时,它是运行在随机数据上。我正常运行了好几次,所以这个结果与CPU速度是独立的。

每个数组元素相对运行时间元素手工reducemin/indexOf

Internet Explorer 9

100,0001.0002.1552.739

200,0001.0142.3243.099

250,0001.0232.2002.330

Internet Explorer 10

100,0001.0004.0574.302

200,0001.0284.0574.642

250,0001.0194.0914.068

你感到惊讶吗?我肯定我很惊讶!

我不仅完全向后又运算了一遍,但手工版本胜利的界限的是超出了我的想象的。

(这表明要知道程序的性能,唯一途径肯定是坐下来测量它。)

我认为正在发生的是,JavaScript优化器可以很好地优化手工代码,因为它非常简单。 循环体没有函数调用,只是一行,在外面没关系的。使用内联函数的版本以从优化器隐藏一些信息结束。(毕竟,优化器不能提前预测是否有人覆盖Array.prototype.reduce或者Math.prototype.min的默认实现,所以不能盲目的内联调用。)结果是,在IE9浏览器上运行手动版本可以快两倍,在IE10上运行速度超过四倍。

我弄错了,因为我想起了JavaScript太像一种解释型语言。在一个纯粹的解释型语言,翻译的开销大约与你让它做的事情的数量成正比,而不是与做这些事情是多么难成正比。就像一个对每一笔交易固定的服务费,不管交易是100美元50美分。你因此试图做一笔大的买卖(调用复杂的内联函数)而不是大量的小买卖(读一个数组元素,比较两个值,增加一个变量,一个变量复制到另一个)。

福利:我在Firefox上做了这个测试,因为我碰巧比较方便。

每个数组元素相对运行时间元素手工reducemin/indexOf

Firefox 16

100,0001.00021.5983.958

200,0000.84821.7012.515

250,0000.83921.7882.090

相同的数据收集在Firefox 16(这听起来是可笑的老旧版本,因为到这篇文章到达队列头部的时候,Firefox将发行523版本)展示了一个不同的形象,尽管胜利者是相同的。数组大小增加的时候手动循环和min/ indexOf变得更高效。这表明,当你增加数据集的大小,固定的开销逐渐变得不那么重要。

一件比较突出的事是,reduce()方法表现地比其他方法差。我的猜测是,设置函数调用(为了内联函数和脚本之间的转换)开销是很大的,并且JavaScript引擎实现器没有花任何时间优化这种案例,因为reduce在实际代码中不常使用。

更新:我夸大了我构造一个好的故事叙述的天真。就像我书的序言中指出的那样,我的故事也许并不完全正确,但他们已经足够真实。我当然知道JavaScript 如今是JITTED(即时解释执行),它改变了计算方式。(同时,是隐藏的数组副本。)

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

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

相关文章

Mybatis Generator 配置详解

许多人在Java项目中都会到使用Mybatis Generator这个工具包&#xff0c;这里把这个工具的配置完整列一下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Gene…

MariaDB强势席卷DB-Engines榜单后续,与阿里云达成全球独家战略合作

2018年10月份&#xff0c;DB-Engines 发布了月全球数据库排名&#xff0c;排名前三的一如既往还是Oracle、MySQL、Microsoft SQL Server。排名是重要指标&#xff0c;同时增长率的重要性也同样备受重视。 MariaDB以黑马之势&#xff0c;强势席卷DB-Engines榜单 在DB-Engines跟…

html5怎么自动生成meta标签,html中meta标签该如何使用

为什么需要使用标签&#xff1f;在我们制作的网页中&#xff0c;要是想让它能够让更多的人去访问&#xff0c;最好的方法就是通过搜索引擎来找到你的网址&#xff0c;于是需要你的网页可以有关键词能够让搜索引擎来识别&#xff0c;于是HTML中的标签就是这个功能&#xff0c;将…

2025年将达6.4万亿美元!AI这下玩大了……

最近&#xff0c;在看大厂新季度财报时&#xff0c;发现了“搜狗”亮眼的成绩。就在前天&#xff0c;搜狗发布了2019年第三季度财报&#xff1a;营收3.149亿美元&#xff0c;实现14%的同比增长&#xff0c;高于行业增长速度。搜狗的净利润达3660万美元&#xff0c;比去年同期增…

存储系统设计——NVMe SSD性能影响因素一探究竟

目录 1 存储介质的变革 2 NVME SSD成为主流 2.1 NAND FLASH介质发展 2.2 软件层面看SSD——多队列技术 2.3 深入理解SSD硬件 3 影响NVME SSD的性能因素 3.1 GC对性能的影响 3.2 IO PATTERN对性能的影响 3.2.1 顺序写入Pattern对SSD性能优化的奥秘 3.2.2 读写冲突Patte…

教程 海湾主机crt_海湾消防主机JB-QT-GST5000火灾报警控制器(联动型)与crt是怎么联接编公式的...

联动公式是用来定义系统中报警设备与被控设备间联动关系的逻辑表达式。当系统中的探测设备报警或控制模块的状态发生变化时&#xff0c;控制器可按照这些逻辑表达式自动对被控设备执行“立即启动”或“延时启动”操作。本系统联动公式由等号分成前后两部分&#xff0c;前面为条…

使用IntelliJ IDEA 2020 高效开发 springboot项目

文章目录一、快速开发基础配置1. 全局配置2. maven3. 自动导入包4. 取消大小写敏感一、快速开发基础配置 前置知识&#xff1a; 有些时候明明都设置好了一些配置&#xff0c;但是新建项目之后&#xff0c;就恢复默认设置了&#xff0c;原因是你设置的配置支队你刚打开的这一个…

html实体转换成xa0,关于javascript:反应道具:在JSX动态内容中使用HTML实体?

我有一个React组件&#xff0c;我想为其道具分配一个包含JavaScript变量和HTML实体的字符串。我尝试过的一些方法导致HTML实体被转义。例如&#xff0c;从字面上呈现为" "而不是" –"。有没有办法让HTML实体在分配给React道具的JSX动态内容块中呈现为未转义…

基于Lucene查询原理分析Elasticsearch的性能

前言 Elasticsearch是一个很火的分布式搜索系统&#xff0c;提供了非常强大而且易用的查询和分析能力&#xff0c;包括全文索引、模糊查询、多条件组合查询、地理位置查询等等&#xff0c;而且具有一定的分析聚合能力。因为其查询场景非常丰富&#xff0c;所以如果泛泛的分析其…

首次落地中国大陆的OpenInfra:中国对于开源做出的贡献力量已不可忽视

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 刘丹责编 | 阿秃一张标志着上海现代建筑地标的东方明珠海报&#xff0c;另一张展示着上海悠久历史的豫园景区海报&#xff0c;不仅向我们展示了这座城市浓厚的历史气息与现代化的繁荣&#xff0c;也让我们看到了OpenStack历经…

java类验证和装载顺序_Java类的加载机制和双亲委派模型

Java类的加载机制和双亲委派模型1类的加载机制类从被加载到虚拟机内存中开始&#xff0c;到卸载出内存为止&#xff0c;它的整个生命周期包括了&#xff1a;加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(using)、和…

任正非:华为 5G 是瞎猫碰死老鼠

喜欢话糙理不糙的任正非&#xff0c;又飙金句。11月6日&#xff0c;在和彭博社记者对话时&#xff0c;谈到华为5G&#xff0c;他说&#xff1a;“回顾这个过程&#xff0c;我们也没有什么必胜的信心&#xff0c;有时候也是瞎猫碰上了死老鼠&#xff0c;刚好碰上世界是这个需求。…

html5游戏开发box2djs,Box2D.js简易示例

Box2dWeb example//在页面加载完毕后启动整个Box2D程序function init() {//简化缩写各个对象名称var b2Vec2 Box2D.Common.Math.b2Vec2;var b2AABB Box2D.Collision.b2AABB;var b2BodyDef Box2D.Dynamics.b2BodyDef;var b2Body Box2D.Dynamics.b2Body;var b2FixtureDef Bo…

七个不容易被发现的生成对抗网络(GAN)用例

像许多追随AI发展的人一样&#xff0c;我无法忽略生成建模的最新进展&#xff0c;尤其是图像生成中生成对抗网络&#xff08;GAN&#xff09;的巨大成功。看看下面这些样本&#xff1a;它们与真实照片几乎没有区别&#xff01; 从2014年到2018年&#xff0c;面部生成的进展也非…

floquet端口x极化入射波_请问CST 2012 floquet中的模式设置

大家好&#xff0c;我用的是CST2012&#xff0c;我已经知道floquet中的TE00和TM00分别代表两种互相正交的线偏振的平面波&#xff0c;那如果我想模拟一束非偏振的平面波入射应该怎么设置?另外&#xff0c;如果我是用TE00的偏振光入射&#xff0c;那么在计算透射率的时候在透射…

端口占用8080

1. winr键输入cmd进入命令行&#xff1a;执行以下命令&#xff1a; netstat -ano 2. 找到8080端口对应的pid 3. 打开任务管理器&#xff1a;找到对应的pid&#xff0c;右击结束任务即可

华为人到底几点钟下班?

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 程序猿责编 | 阿秃转自 &#xff5c; 鲜枣课堂近日&#xff0c;在职场论坛上有这样一个帖子&#xff1a;华为员工晒出7天的上班打卡记录。该员工晒出自己在 9 月份 23 号到 29 号的打卡记录。其中每天 9 点 30 之前打卡&am…

手把手教你数据不足时如何做深度学习NLP

作为数据科学家&#xff0c;你最重要的技能之一应该是为你的问题选择正确的建模技术和算法。几个月前&#xff0c;我试图解决文本分类问题&#xff0c;即分类哪些新闻文章与我的客户相关。 我只有几千个标记的例子&#xff0c;所以我开始使用简单的经典机器学习建模方法&#…

怎样判断一个网站是不是前后端分离的?

1.页面右击选择【检查】或者打开谷歌开发者模式 2.选择【NetWork】&#xff0c;重新刷新页面 3. 选择XHR 全称(xmlhttprequest)&#xff0c;后&#xff0c;下面会有地址列表&#xff1b;查看页面的数据是从页面渲染的数据还是通过后端api接口获取的 4.左侧点击第一个链接&…

vue 圆形 水波_vue项目百度地图+echarts的涟漪水波效果

先看效果image.pngid"allmap"class"map"ref"map">import echarts from "echarts";import "echarts/extension/bmap/bmap";export default {data() {return {chart: echarts.ECharts,bmap: {},mapZoom: 6,};},mounted() {…