迟早,绝对每个程序员都可能会遇到诸如衡量性能的概念。
在任何办公室,任何团队中,甚至当您独自与Tyler Durden(但仅在Tyler是程序员的情况下)时,也至少有一次关于如何实现此功能或该功能以使其起作用的争议。快速。但是通常不引用快速作为一种特征,因此我建议讨论如何快速将摘要转换为非抽象数字。
工具类
您可以使用不同的工具来衡量性能,让我们谈谈我遇到的一些工具。
日期
描述日期/时间的本机数据结构。
所有度量都归结为以下事实:我们先度量函数之前的日期,然后度量函数之后的日期,然后求出差值。
不用说,由于在OS中存储日期的特殊性,此类测量的任何冗余精度都是毫无疑问的。
操作系统启动时,系统时钟从硬件初始化,然后使用常规计时器中断维护系统时间。(维基百科)
简而言之,时间是以特定频率缓存和更新的,并且我们的测量精度不能超过此更新的频率。
Date可以派上用场的唯一情况是,如果要替换需要几秒钟才能执行的脚本,那么±100ms的差异对您而言并不重要。我通常不建议使用日期进行测量。
Performance.now()
返回以毫秒为单位测量的时间戳,精度为千分之一毫秒。
对于Node.js,度量是从当前执行线程的开始算起的;对于浏览器,是从PerformanceTiming.navigationStart事件计算的。
函数执行时间的度量如下:
const start = performance.now();
myAwesomeFunc();
const end = performance.now();
//
const diffSec = (end - start) / 1000;
// - .
console.log('op/sec: ' + (1 / diffSec);
我更喜欢以op / sec格式比较数字,而不是0.00000546654。
Performance.now()不仅比Date更准确,而且更加方便。您无需执行任何其他操作即可将日期转换为时间戳并返回,您将立即获得方便单位的数字。
Benchmark.js
var suite = new Benchmark.Suite;
// add tests
suite.add('RegExp#test', function() {
/o/.test('Hello World!');
})
.add('String#indexOf', function() {
'Hello World!'.indexOf('o') > -1;
})
.add('String#match', function() {
!!'Hello World!'.match(/o/);
})
// add listeners
.on('cycle', function(event) {
console.log(String(event.target));
})
.on('complete', function() {
console.log('Fastest is ' + this.filter('fastest').map('name'));
})
// running
.run();
Benchmark.js . mocha, , .
. , : js, .
:
— , .
.
function checkLen(array: number[]) {
let len = 0;
for (let i = 0; i< 1_000_000; i++) {
len = array.length;
}
return len;
}
*: 720.4278 op/sec
*- .
, .
, , , .
, , , .
, Hrodvitnir? , . -, :
function checkLen(array: number[]) {
let len = 0;
len = array.length;
for (let i = 0; i< 1_000_000; i++) {
}
return len;
}
: 718.3247 op/sec
: .
: 0.28%, , . , .
, . , js .
- . , , , . .
, .
, , . . LICM.
, :
function checkLen(
array: number[],
len: number[] // 1000000
) {
for (let i = 0; i< 1_000_000; i++) {
len[i] = array.length;
}
return len;
}
: 330.0807
, , , , , , , , , , .
, .
, , .
, .
1 1,000,000.
const testArray = _.range(1, 1_000_000).toArray();
// 1 1,000,000
function checkFilter(array: number[]) {
return _(array).where(item => !!(item % 2)).toArray()
}
: 23.4559
-, , filter , lodash.
, —
, :
: 13.3961
. , lodash, .
, - .
:
No | ||
---|---|---|
1 | 30 | 30 |
2 | 27 | 28.5 |
3 | 18 | 25 |
4 | 24 | 24.75 |
5 | 13 | 22.4 |
, , .
, 10 , 10 .
, , , .
, , "", , , , -. , , , .
: .
.
, , / , . ., , , .
. , .
, , , .
( , ).
, , , .
, "": . , .
, . , .
.
:
function checkFilter(array: number[]) {
return _(array).where(item => !!(item % 2)).toArray()
}
:
function checkFilter(array: number[]) {
_(array).where(item => !!(item % 2)).toArray()
}
, , , , , .
, , , .
, , , . , .
, - — .
10,000,000 75 .
, .
, . , .
, .
, , , 10 , 200 .
, 200 , , .
, . , , . , . , , — .
. , .
, , .
— 25% , 25% , . .
: , , .
. .
, - , , , , .
:
function checkFilter(array: number[]) {
return _(array).where(item => !!(item % 2)).toArray()
}
:
: 23.4559
: ? , . ?
, / .
基准测试是一个非常有趣的活动,有助于及时发现并改进代码中的问题区域。但这也是与其自身困难相关的职业。
在本文中,我试图回答我所遇到的问题,并试图突出一些有趣的观点。
感谢您的关注!