Cepat atau lambat, pasti setiap programmer akan menemukan konsep seperti mengukur kinerja.
Di kantor mana pun, di tim mana pun, dan bahkan ketika Anda sendirian dengan Tyler Durden Anda (tetapi hanya jika Tyler Anda adalah seorang programmer), setidaknya sekali, akan ada perselisihan tentang bagaimana menerapkan fungsi ini atau itu sehingga berfungsi. cepat. Tetapi cepat, sebagai karakteristik, biasanya tidak dikutip, jadi saya mengusulkan untuk berbicara tentang cara cepat mengubah abstrak menjadi bilangan non-abstrak.
Alat
Anda dapat mengukur kinerja dengan alat yang berbeda, mari kita bicara tentang beberapa di antaranya yang saya temukan.
Tanggal
Struktur data asli yang menggambarkan tanggal / waktu.
Semua pengukuran bermuara pada fakta bahwa kita mengukur tanggal sebelum fungsi, lalu tanggal setelah fungsi, dan mengambil perbedaannya.
Tak perlu dikatakan, tidak ada pertanyaan tentang akurasi yang berlebihan dari pengukuran seperti itu karena kekhasan menyimpan tanggal di OS.
Jam sistem diinisialisasi dari perangkat keras saat sistem operasi melakukan booting, dan kemudian waktu sistem dipertahankan menggunakan interupsi pengatur waktu reguler. ( Wikipedia )
Sederhananya, waktu di-cache dan diperbarui pada frekuensi tertentu, dan keakuratan pengukuran kami tidak dapat melebihi frekuensi pembaruan ini.
, 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
: ? , . ?
, / .
Benchmarking adalah aktivitas yang sangat menyenangkan yang membantu memperhatikan area masalah dalam kode tepat waktu dan membuatnya lebih baik. Tetapi ini juga merupakan pekerjaan yang terkait dengan kesulitannya sendiri.
Pada artikel ini, saya mencoba menjawab pertanyaan yang muncul di waktu saya, mencoba menyoroti beberapa poin menarik.
Terima kasih atas perhatian Anda!