美文网首页
南辕北辙的故事

南辕北辙的故事

作者: 坠入莱茵河 | 来源:发表于2017-11-29 12:38 被阅读0次

之前只知道console函数会影响效率 但是从未听说过第一个console与后面的console差别会如此大

奇怪的事儿 相同的代码 放在不同的地方 执行速度会差别这么大

// test 1
$ node parseArr.js
26
loop: 3.195ms // 反过来也是
26
loop1: 0.155ms
42
recursion: 0.332ms

// test 2
$ node parseArr.js
26
loop1: 3.300ms
26
loop: 0.160ms
42
recursion: 0.323ms

尝试定位原因
注释掉console

$ node parseArr.js
loop1: 0.349ms 
loop: 0.048ms
recursion: 0.259ms

获取每个console的执行时间

$ node parseArr.js
26
log1: 2.912ms // 每一个log执行的时间
loop1: 3.491ms
26
log2: 0.081ms // 每一个log执行的时间
loop: 0.178ms
42
log3: 0.064ms // 每一个log执行的时间
recursion: 0.372ms

只留一个试试?

$ node parseArr.js // 浏览器环境下的结果也一致
26
log1: 2.919ms
loop1: 3.523ms

测试console函数的时间

console.time('a')
console.log('b')
console.timeEnd('a')

console.time('a')
console.log('b')
console.timeEnd('a')

... * 20

$ node console.js
b
a: 1.633ms
b
a: 0.075ms 
b
a: 0.075ms 
... * 20


那这会影响到大数据量 日常的测试结果吗?

console.time('a')
// console.log('b')
for(let i = 0;i < 500000000;i++) {
  
}
console.timeEnd('a')

console.time('c')
// console.log('d')
for(let i = 0;i < 500000000;i++) {

}
console.timeEnd('c')

$ node console.js
a: 857.437ms
c: 851.718ms

这个差异看来不会影响日常工作中的测试结果

不断测试之后 发现在Node和Chrome环境下执行的第一个console会比之后的console耗时多20倍左右(但基数过小 一般不会影响工作中的测试) 尝试查阅资料后也没有什么相关的解释 也不知道浏览器/Node处理console 函数的相关机制
推断的话 只能想象成第一次获取了console函数后copy了一份在本地 作为缓存用 这样再执行时就不用这么耗时了?

不过一般生产环境会使用UglifyJs来压缩代码 所以一般来说不需要太过纠结这个问题

// Node环境下不同的执行顺序也会影响着执行效率??
let array = [
  ['1', '', 'title1', 1, 2, 3],
  ['2', '', 'title2', 4, 5, 6],
  ['11', '1', 'title3', 7, 8, 9],
  ['21', '2', 'title4', 10, 11, 12],
  ['22', '2', 'title5', 13, 14, 15],
  ['111', '11', 'title6', 16, 17, 18],
  ['211', '21', 'title7', 19, 20, 21],
  ['2111', '211', 'title8', 22, 23, 24]
];

class ParseArray {
  constructor(inputArray) {
      this.inputArray = inputArray
      this.outputArray = [{
          "sub_data": []
      }]
      this.loopLength = 0
  }
  loop(pId, items) {
      this.inputArray.forEach((item, idx) => {
          this.loopLength++
              if (item[1] === pId) {
                  items.push({
                      main_data: item.slice(2),
                      sub_data: []
                  })
                  delete this.inputArray[idx]
                  this.loop(item[0], items[items.length - 1].sub_data)
              }
      })
  }
}


function ParseArrayEs5 () {
this.loopLength = 0
this.outputArray = []
this.array2 = JSON.parse(JSON.stringify(array))
}


function convert_table_data_with_level(data, parent_node = "") {
  var level_1_data = [],
      new_data = [];
  for (var i = 0, len = data.length; i < len; i++) {
      data[i][1] === parent_node ? level_1_data.push(data[i]) : new_data.push(data[i]);
      recursionLength++;
  }

  return level_1_data.map(function(arr) {
      parent_node = arr[0];
      return {
          main_data: arr.splice(2, arr.length - 2),
          sub_data: convert_table_data_with_level(new_data, parent_node)
      }
  });
}


ParseArrayEs5.prototype.loop = function(pId, items) {
this.array2.forEach((item, idx) => {
    this.loopLength++
    if (item[1] === pId) {
        items.push({
            main_data: item.slice(2),
            sub_data: []
        })
        delete this.array2[idx]
        this.loop(item[0], items[items.length - 1].sub_data)
    }
})
}



console.time("es5")
let outputArray666 = new ParseArrayEs5()
outputArray666.loop('', outputArray666.outputArray)
console.timeEnd("es5")
console.log(outputArray666.loopLength)



console.time("recursion")
let recursionLength = 0;
let data_with_level = convert_table_data_with_level(array, '')
console.timeEnd("recursion")
console.log(recursionLength)


console.time("loop1")
let val1 = new ParseArray(array.slice())
val1.loop('', val1.outputArray[0].sub_data)
console.timeEnd("loop1")
console.log(val1.loopLength)

相关文章

  • 南辕北辙的故事

    之前只知道console函数会影响效率 但是从未听说过第一个console与后面的console差别会如此大 奇怪...

  • 人生小故事:南辕北辙

    最近,试着给孩子们讲《哲学与人生》,以期更近距离接触一下职业学校的学生。对这个年龄的孩子们来说,谈哲学问题,探究深...

  • 《南辕北辙》,真是南辕北辙

    2018年,那时候我好像结婚没有多久,还在享受着甜蜜的二人世界。而现在,孩子都可以上幼儿园了。 在这三年里,发生了...

  • 南辕北辙

    魏王想攻打赵国,季梁劝他说:"我在太行山下遇到一个赶着车向北走的人,告诉我说:‘我要去楚国。'我问他:‘你要去楚国...

  • 南辕北辙

    词/花海洋 我在太阳处询问你消息 不知道你却找月亮问我身在何处 问错方向都说没见过 以为视线里再不会有你影子 像是...

  • 南辕北辙

    起床,拉开窗帘,又是一个灿烂明媚的周末。他拖起那双价值四块五的蓝色塑料拖鞋,晃悠悠走到阳台。无风,太阳撒下一层极...

  • 南辕北辙

    鼠梦正酣时,牛拥斗志痴。 同心难一气,连理不连枝。

  • 南辕北辙

    从前有个人从魏国到楚国,带上盘缠、雇了好车、骑上骏马上路,楚国在魏国南面而这个人在没有确定正确方向的时候...

  • 南辕北辙

    我想拥有一个本领,但我却一直在练习和它相反的事情。 一天的学习,家庭,健康等等宣言就在有条不紊的进行。晚上的锦囊会...

  • 南辕北辙

    没人告诉过我,很多人一辈子只能遇见一次,擦肩而过就是杳然一生~ 有时候擦肩而过也是一种很曼妙的事情,因为错过也会有...

网友评论

      本文标题:南辕北辙的故事

      本文链接:https://www.haomeiwen.com/subject/hldubxtx.html