首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript : console.time

Javascript : console.time
EN

Stack Overflow用户
提问于 2018-03-20 18:10:25
回答 1查看 181关注 0票数 1

我很难理解为什么console.time的以下两种实现的时间会有所不同。我试着测试我编写的函数,但是当我用以下两种方式实现console.time时,我得到了非常不同的答案……

为了诊断这一点,我使用了Array.prototype.sort(),并产生了相同的时间不一致。arr是一个长度为n的数组,具有随机整数。我用长度为10,100,1000,10000,100000的随机整数数组来测试它。

注意:我知道 api存在,但我想了解console.time发生了什么。

方法1

代码语言:javascript
复制
function timeLog(title, arr) {
    console.time(title);
    arr.sort();
    console.timeEnd(title);
}

timeLog('time test 1', arr);

方法2:

代码语言:javascript
复制
console.time('time test 2');
arr.sort();
console.timeEnd('time test 2');

我的研究结果:

代码语言:javascript
复制
with method 1
10 item array: 0.198ms
100 item array: 0.196ms
1000 item array: 3.386ms
10000 item array: 65.558ms
100000 item array: 326.774ms

with method 2
10 item array: 0.022ms
100 item array: 0.081ms
1000 item array: 0.534ms
10000 item array: 12.865ms
100000 item array: 77.395ms

可运行的片段:

代码语言:javascript
复制
function randomArray(n) {
  return Array.apply(null, Array(n))
    .map(function() {
      return Math.floor(Math.random() * 1000);
    });
}

function timeLog(title, array) {
  console.time(title);
  array.sort();
  console.timeEnd(title);
}

var arr10 = randomArray(10);
var arr100 = randomArray(100);
var arr1000 = randomArray(1000);
var arr10000 = randomArray(10000);
var arr100000 = randomArray(100000);

var arr10_2 = arr10.slice();
var arr100_2 = arr100.slice();
var arr1000_2 = arr1000.slice();
var arr10000_2 = arr10000.slice();
var arr100000_2 = arr100000.slice();

console.log('method 1: with timeLog function')
timeLog('10 item array', arr10)
timeLog('100 item array', arr100)
timeLog('1000 item array', arr1000)
timeLog('10000 item array', arr10000)
timeLog('100000 item array', arr100000)
console.log();

console.log('method 2: just console.time');
console.time('10 item array-2')
arr10_2.sort()
console.timeEnd('10 item array-2')
console.time('100 item array-2')
arr100_2.sort()
console.timeEnd('100 item array-2')
console.time('1000 item array-2')
arr1000_2.sort()
console.timeEnd('1000 item array-2')
console.time('10000 item array-2')
arr10000_2.sort()
console.timeEnd('10000 item array-2')
console.time('100000 item array-2')
arr100000_2.sort()
console.timeEnd('100000 item array-2')

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-20 18:26:49

我认为这只是因为您同时测试它们,并且优化在第一关就开始了。(和/或其他测试方法问题,如重新排序相同的数组等;无法从问题中看出。)

如果我在一个10,000项数组上这样做,对于每个测试都要小心使用相同的值(并且要注意第二个测试没有按第一个测试排序),在Chrome上,我可以可靠地看到第二个sort的时间比第一个要快--不管我是首先使用timeLog,还是首先使用内联代码:

首先使用timeLog

代码语言:javascript
复制
var arr1 = Array.from({length:10000}, () => Math.floor(Math.random() * 1000));
var arr2 = arr1.slice();

function timeLog(title, arr) {
    console.time(title);
    arr.sort();
    console.timeEnd(title);
}

timeLog('time test 1', arr1);

console.time('time test 2');
arr2.sort();
console.timeEnd('time test 2');

首先使用内联代码:

代码语言:javascript
复制
var arr1 = Array.from({length:10000}, () => Math.floor(Math.random() * 1000));
var arr2 = arr1.slice();

function timeLog(title, arr) {
    console.time(title);
    arr.sort();
    console.timeEnd(title);
}

console.time('time test 2');
arr2.sort();
console.timeEnd('time test 2');

timeLog('time test 1', arr1);

然而,如果我做了两次,我就会发现这种差异在第二次消失了:

两次,首先使用timeLog

代码语言:javascript
复制
var arr1 = Array.from({length:10000}, () => Math.floor(Math.random() * 1000));
var arr2 = arr1.slice();

var arr3 = arr1.slice();
var arr4 = arr1.slice();

function timeLog(title, arr) {
    console.time(title);
    arr.sort();
    console.timeEnd(title);
}

timeLog('timeLog 1', arr1);

console.time('inline 1');
arr2.sort();
console.timeEnd('inline 1');

timeLog('timeLog 2', arr1);

console.time('inline 2');
arr2.sort();
console.timeEnd('inline 2');

两次,首先使用内联代码:

代码语言:javascript
复制
var arr1 = Array.from({length:10000}, () => Math.floor(Math.random() * 1000));
var arr2 = arr1.slice();

var arr3 = arr1.slice();
var arr4 = arr1.slice();

function timeLog(title, arr) {
    console.time(title);
    arr.sort();
    console.timeEnd(title);
}

console.time('inline 1');
arr2.sort();
console.timeEnd('inline 1');

timeLog('timeLog 1', arr1);

console.time('inline 2');
arr2.sort();
console.timeEnd('inline 2');

timeLog('timeLog 2', arr1);

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49391384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档