在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(即时解释执行),它改变了计算方式。(同时,是隐藏的数组副本。)

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

  1. java从数组查找指定整数_如何在Java中使用重复项查找整数数组中的K个缺失数字?...

    java从数组查找指定整数 自从我讨论任何编码或算法面试问题以来已经有很长时间了,因此我想重新考虑一种最流行的基于数组的编码问题,即在给定数组中查找缺失的数字. 在进行编程工作面试之前,您可能已经听说 ...

  2. js数组查找最接近_如何从javascript中的对象数组中获取最接近的先前id

    我对您的代码进行了一些更改,现在应该可以正常工作了.看一看. const array = [{id:3}, {id:4}, {id:10}, {id:15}]; // you should order ...

  3. arr数组怎么取值_【JavaScript】Array数组常规使用小结(持续更新......)

    一.概述 JavaScript的 Array 对象是用于构造数组的全局对象,数组是类似于列表的高阶对象. 二.创建数组四种方式 2.1.字面-隐式创建数组 var movieList = [" ...

  4. 查找数组中的指定元素的位置--顺序查找与二分查找

    Java代码-查找数组中的指定元素的位置 /*** 查找数组中指定元素(顺序查找)*/ class Demo6 {public static void main(String[] args) {int ...

  5. java 字符串 数组 索引_如何在Java中找到数组中元素的索引?

    我希望在Java中找到给定元素的索引,知道它的内容. 我尝试了以下示例,该示例不起作用: class masi { public static void main( String[] args ) { ...

  6. 旋转数组中的最小元素 java_程序员算法面试题之旋转数组的最小值

    本文参考书籍 <剑指offer> 作者何海涛 01 题目:数组最小值 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个递增排序的数组,输出旋转数组的最小元素.例 ...

  7. Java黑皮书课后题第7章:7.10(找出最小元素的下标)使用下面的方法头编写一个方法,求出一个整数数组中的最小元素下标。编写测试程序,提示用户输入10个数字,调用这个方法返回最小值的下标(多个则最小

    7.10(找出最小元素的下标)使用下面的方法头编写一个方法,求出一个整数数组中的最小元素下标.编写测试程序,提示用户输入10个数字,调用这个方法返回最小值的下标(多个则返回最小的下标) 题目 题目描述 ...

  8. Java黑皮书课后题第7章:7.9(找出最小元素)使用下面的方法头编写一个方法,求出一个整数数组中的最小元素。编写测试程序,提示用户输入10个数字,调用这个方法返回最小值,并显示这个最小值

    7.9(找出最小元素)使用下面的方法头编写一个方法,求出一个整数数组中的最小元素.编写测试程序,提示用户输入10个数字,调用这个方法返回最小值,并显示这个最小值 题目 题目描述与运行示例 破题 代码 ...

  9. 找出二维数组中的最小元素

    描述 找出m×n的二维数组中的最小元素,把该元素所在行的各个元素(假设只有一个最小元素)与二维数组的末行元素互换. 输入 第一行包含2个正整数m和n,分别表示二维数组的行数和列数,其中m和n均不超过3 ...

最新文章

  1. seaborn可视化水平箱图(Horizontal Boxplot in Python with Seaborn)
  2. 一款插件如何让Github变得不一样?
  3. GraphQL引入依赖maven仓库配置
  4. linux 磁盘延时,Linux:如何模拟硬盘延迟?我想在不使用CPU电源的情况下增加iowait值...
  5. 数据库-优化-为什么要进行数据库优化
  6. html zoom中心,css中的zoom的使用
  7. vim 命令模式 筛选_10个步骤的筛选器模式
  8. 如何用Linux命令行管理网络:11个你必须知道的命令
  9. 如何有效的使用对话框之二
  10. mysql 存储xml类型_(MariaDB)MySQL数据类型详解和存储机制
  11. 服务器64位还是32位系统好,云服务器64位还是32位
  12. JavaScript基础
  13. 深度linux系统老版本,Deepin Linux15.7下载
  14. UE4 讯飞语音识别插件
  15. Java TreeMap排序
  16. 谈谈任务调度的四种实现方式
  17. 文件共享服务器热备,两台云服务器如何实现双机热备
  18. 如何让IE11自动下载安装ActiveX插件并使用网页VLC播放视频
  19. Power Query批量合并Excel文件
  20. 纪中训练5月23日提高组T1

热门文章

  1. html中article、section、aside的区别与联系
  2. 阿里云服务网格ASM集成SLS告警
  3. 日均万亿条数据如何处理?爱奇艺实时计算平台这样做
  4. 基于函数计算的 Serverless AI 推理
  5. 阿里专家杜万:Java响应式编程,一文全面解读
  6. MaxCompute使用常见问题总结
  7. 云原生安全模型与实践
  8. 《2019~2020网络安全态势观察报告》重磅发布!
  9. 移动云2020 H1营收44.57亿元,同比增长556.4%
  10. 华为美国研发中心将迁至加拿大;高通CEO否认中国5G超美国:技术上还没有,顶多算并驾齐驱;亚马逊宣布进军量子界……...