相关疑难解决方法(0)

如何将某些内容附加到数组中?

如何在JavaScript中将对象(如字符串或数字)附加到数组?

javascript arrays append

2895
推荐指数
23
解决办法
299万
查看次数

为什么array.push有时比array [n] = value更快?

作为测试一些代码的副作用,我编写了一个小函数来比较使用array.push方法与直接寻址(array [n] = value)的速度.令我惊讶的是,推送方法通常表现得更快,特别是在Firefox中,有时在Chrome中.只是出于好奇:任何人都有解释吗?您可以在此页面找到测试(单击"数组方法比较")

javascript browser arrays performance firefox

69
推荐指数
4
解决办法
3万
查看次数

有没有理由JavaScript开发人员不使用Array.push()?

我经常看到开发人员在JavaScript中使用如下表达式:

arr = []
arr[arr.length] = "Something"
arr[arr.length] = "Another thing"
Run Code Online (Sandbox Code Playgroud)

会不会push更合适?

arr = []
arr.push("Something")
arr.push("Another thing")
Run Code Online (Sandbox Code Playgroud)

javascript

40
推荐指数
2
解决办法
2万
查看次数

寻找矢量之间角度测量的廉价算法

使用余弦规则找到两个向量之间的角度并不难.但是,因为我正在为资源非常有限的平台编程,所以我想避免计算诸如sqrtarccos.即使是简单的划分也应该尽可能地受到限制.

幸运的是,我不需要角度本身,但只需要一些与所述角度成比例的值.

所以我正在寻找一些计算上便宜的算法来计算与两个矢量之间的角度相关的量.到目前为止,我还没有找到符合条件的东西,也没有能够自己想出一些东西.

algorithm geometry trigonometry

29
推荐指数
4
解决办法
1万
查看次数

现代JavaScript JITers需要循环中的数组长度缓存吗?

我发现在循环中缓存数组length属性的做法for非常令人反感.如,

for (var i = 0, l = myArray.length; i < l; ++i) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

至少在我看来,与直截了当相比,这对可读性造成了很大伤害

for (var i = 0; i < myArray.length; ++i) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

(更不用说由于词法范围和提升的性质,它会将另一个变量泄漏到周围的函数中.)

我希望能够告诉任何做这件事的人"不要打扰;现代的JS JITers会优化这个技巧." 显然这不是一个微不足道的优化,因为你可以在迭代过程中修改数组,但我会认为考虑到JITers和他们的运行时分析技巧所听到的所有疯狂的东西,他们已经得到了这个现在.

任何人都有这样或那样的证据吗?

是的,我也希望说"这是微观优化就足够了;在你描述之前不要这样做." 但并不是每个人都会听到这种理由,特别是当它成为缓存长度的习惯时,它们最终会自动地这样做,几乎就像一种风格选择.

javascript optimization jit loops

13
推荐指数
2
解决办法
3259
查看次数

使用零初始化javascript数组

我正在测试使用零初始化大型javascript数组的不同方法.到目前为止,使用push(0)的简单for循环似乎远远超过其他方法(参见http://jsperf.com/initialise-array-with-zeros),但我对此有效性表示怀疑测试.

在实践中,您只需创建一个这样的大型数组并对其进行缓存,以便稍后当您再次需要大型初始化数组时,您可以简单地对其进行切片.因此,我认为最重要的评估是第一次执行此代码所需的时间,而不是许多试验的平均值.

有人不同意吗?或者有人知道我如何/在哪里测试一轮的时间?

编辑:为了回应关于分配具有如此多零的数组的基本原理的一些误解,我想澄清两件事.

  1. 没有稀疏性.我需要创建多个大型数组并将它们用于计算.这些副本将填充浮点数,浮点数恰好为零的可能性可以忽略不计.
  2. 并非所有计算都是按顺序在阵列上执行的.我相信,与覆盖通过引用传递的数组中的值相比,在进程中生成数组的函数效率低(参见例如gl-matrix.js).

因此,我的解决方案是创建一个大型零填充数组,然后在需要新数组时获取slice(),然后通过引用将该副本传递给任何函数以使用它.在任何浏览器中,Slice都是超级超级快速的.

现在,虽然您可能仍然担心我为什么要这样做,但我真正感兴趣的是,如果可以在第一次运行时评估不同初始化方法的性能.我希望有这个时间,因为在我的情况下,我肯定只运行一次.

是的,我的jsperf代码可能会错过一些解决方案.所以如果你有一个我没有想到的方法,请随意添加它!谢谢!

javascript optimization performance

3
推荐指数
1
解决办法
9099
查看次数