遅かれ早かれ、絶対にすべてのプログラマーがパフォーマンスの測定などの概念に出くわす可能性があります。
どのオフィスでも、どのチームでも、そしてあなたがタイラーダーデンと一人でいるときでさえ(ただし、タイラーがプログラマーである場合のみ)、少なくとも一度は、これまたはその機能を実装して機能させる方法について論争があります。速い。しかし、特徴としての高速は通常引用されないので、抽象を非抽象の数値にすばやく変換する方法について話すことを提案します。
ツール
さまざまなツールを使用してパフォーマンスを測定できます。私が遭遇したツールのいくつかについて説明しましょう。
日付
日付/時刻を記述するネイティブデータ構造。
すべての測定は、関数の前の日付、次に関数の後の日付を測定し、差をとるという事実に要約されます。
言うまでもなく、OSに日付を保存するという特殊性のために、このような測定の冗長な精度に疑問の余地はありません。
システムクロックは、オペレーティングシステムの起動時にハードウェアから初期化され、その後、定期的なタイマー割り込みを使用してシステム時間が維持されます。(ウィキペディア)
簡単に言えば、時間は特定の頻度でキャッシュおよび更新され、測定の精度はこの更新の頻度を超えることはできません。
, Date , , , ± 100 . Date .
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, . - timestamp , .
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
: ? , . ?
, / .
ベンチマークは、コード内の問題のある領域に時間内に気づき、それを改善するのに役立つ非常に楽しいアクティビティです。しかし、これはそれ自体の困難に関連する職業でもあります。
この記事では、私は自分の時代に生じた質問に答え、いくつかの興味深い点を強調しようとしました。
清聴ありがとうございました!