用零初始化 JavaScript 数组
initialise javascript array with zeros
我正在测试不同的方法来初始化一个带有零的大型javascript数组。到目前为止,带有 push(0) 的简单 for 循环似乎远远优于其他方法(见 http://jsperf.com/initialise-array-with-zeros),但我对此测试的有效性表示怀疑。
实际上,您只会创建一次如此大的数组并缓存它,以便以后再次需要大型初始化数组时,您可以简单地对其进行切片。因此,我认为最重要的评估是第一次执行此代码所需的时间,而不是许多试验的平均值。
有人不同意吗?或者有人知道我如何/在哪里可以测试一轮的时间?
编辑:为了回应一些关于分配具有如此多零的数组的基本原理的误解,我想澄清两件事。
- 不会有稀疏性。我需要创建多个大数组并使用它们进行计算。这些副本将充满浮点数,浮点数正好为零的机会可以忽略不计。
- 并非所有计算都是按顺序对数组执行的。我相信,与覆盖通过引用传递的数组中的值相比,在进程中生成数组的函数效率低下(例如参见 gl-matrix.js)。
因此,我的解决方案是创建一个大的零填充数组一次,然后在需要新数组时获取一个slice(),然后通过引用将该副本传递给任何函数以使用它。Slice在任何浏览器中都是超级快的。
现在,尽管您可能仍然担心我为什么要这样做,但我真正感兴趣的是,是否可以在第一次运行时评估不同初始化方法的性能。我想有这个时间,因为在我的情况下,我肯定只会运行一次。
是的,我的jsperf代码可能会错过一些解决方案。因此,如果您有我没有想到的方法,请随时添加它!谢谢!
仅测试一次操作非常复杂,因为性能会根据计算机正在执行的其他操作而有很大差异。您必须多次运行该单个测试,并在每个测试之间重置为相同的条件。jsperf 多次运行测试的原因是为了获得一个良好的平均值来清除异常。
您应该在不同的浏览器中对此进行测试,以查看哪种方法总体上是最好的。你会看到你得到的结果非常不同。
在 Internet Explorer 中,最快的方法实际上不是你测试过的方法,而是分配零的简单循环:
for (var i = 0; i < numzeros; i++) zeros[i] = 0;
从 ES6 开始,你可以像这样使用填充:
var totals = [].fill.call({ length: 5 }, 0);
没有实际的任务可以等于"用零初始化javascript数组",尤其是一个大任务。你应该重新思考为什么你需要0。这是一个稀疏数组,您需要 0 作为默认值吗?然后只需添加一个访问条件即可将检索到的值设置为 0,而不是浪费内存和初始化时间。
- 如何遍历包含对象的数组-javascript
- 保存数组javascript
- 查找数组javascript中包含的元素类型
- 算法:从数组(javascript/angular)中按当前日期获取上一个和下一个事件
- 从多维数组javascript中提取特定值
- 如何在数组javascript中选择伪随机值
- 拆分字符串数组(JavaScript)后未定义
- 从数组JavaScript中删除并返回最后n个项的最快方法
- 使用条件for循环更新数组-Javascript
- 从数组javascript创建新对象
- 用数组(javascript)中的值替换regex捕获
- 从数组[Javascript]的总长度中减去一个干净的数字
- 将一个字符串数组解析为一个新的数组javascript
- 如何将对象转换为对象数组javascript
- 赢得't循环数组javascript
- 从不同的数组 JavaScript 中获取值
- 多维数组 JAVASCRIPT 出了点问题
- 可以't分配给一个对象数组javascript
- 比较数组JavaScript中的对象
- 如何完成缺少(连续)元素的数组|Javascript