JS的一些性能测试。
发布于 10 年前 作者 hezedu 5015 次浏览 最后一次编辑是 8 年前 来自 分享

环境 系统XP 32位,nodejs 0.10.33;

写JS很容易忽略掉性能问题,下面我做了一下测试,每个测试都是循环10~1000万次。

  1. for 循环 i ++ 、 i += i 、 i = i + 1 几乎没什么区别
  2. 使用 for in 数组 比 传统 for 循环 慢太多(千万次 慢了100倍)
  3. 遍历对象 使用for in最快。 还有第2种方法:是用Object.key方法先取得key数组,再用传统for循环,这个比较慢。 但是for in 加上hasOwnProperty 判定 就和方法2 速度一样了。所以说Object原型上添加属性的人不能留啊。
  4. 对象取值用点运符.key['key']没啥区别。但key里有特殊字符就不一样了。
var test = {
  a:'a',
  "b":'b'
}
var test2 = {
  a:'a',
  "/b":'b'
}
//循环1000万次
// test.a 比 test2.a 慢了3倍。
//查找不存在的key c: 
// test.c  比 test.a 慢了一倍。
// test2.c 比 test2.a 慢了100倍。
// test2.c 比 test.c 慢了300倍。

5 . Number(str) 很慢,所以在 if 判定的时候尽量 === 号。尽量避免 字符串和数字 相加 6 . number.toString 比Number(str)要快得多。 7 . 最好不要在函数内声明函数。千万级遍历下比在函数外声明,然后在函数内调用要快得多。 8 . 少赋值 9 . cpu瓶颈 执行千万级函数测试,同时开两个,跟同时开三个 情况有时大大不同。 10 . 在chrome下测试,销毁内存,用delete 删掉一个数组,查内存快照大小竟跟没用delete之前一样,赋值为null 则明显没了。难道用delete 还得手动递归遍历?

5 回复

为什么不用benchmark呢

数组一般用forEach或map等吧,和这俩比较了吗

for in 数组 和forEach 呢?

和 forEach 比的话直接在 jsPerf 搜就好了,比如这个:https://jsperf.com/for-vs-foreach/9。性能上肯定 for 循环最快。另外遍历数组不应该用 for in 语法,所以比较它的性能没什么意义。

回到顶部