之前只知道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)
网友评论