Früher oder später wird wahrscheinlich jeder Programmierer auf ein Konzept wie das Messen der Leistung stoßen.
In jedem Büro, in jedem Team und selbst wenn Sie mit Ihrem Tyler Durden allein sind (aber nur, wenn Ihr Tyler ein Programmierer ist), wird es mindestens einmal Streit darüber geben, wie diese oder jene Funktion implementiert werden soll, damit sie funktioniert schnell. Aber schnell wird als Merkmal normalerweise nicht zitiert, deshalb schlage ich vor, darüber zu sprechen, wie man eine Zusammenfassung schnell in eine nicht abstrakte Zahl verwandelt.
Werkzeuge
Sie können die Leistung mit verschiedenen Tools messen. Lassen Sie uns über einige der Tools sprechen, auf die ich gestoßen bin.
Datum
Eine native Datenstruktur, die ein Datum / eine Uhrzeit beschreibt.
Alle Messungen laufen darauf hinaus, dass wir das Datum vor der Funktion und dann das Datum nach der Funktion messen und die Differenz berechnen.
Es ist unnötig zu erwähnen, dass von einer redundanten Genauigkeit solcher Messungen aufgrund der Besonderheiten der Speicherung des Datums im Betriebssystem keine Rede sein kann.
Die Systemuhr wird beim Booten des Betriebssystems von der Hardware aus initialisiert, und dann wird die Systemzeit mithilfe regelmäßiger Timer-Interrupts beibehalten. ( Wikipedia )
Einfach ausgedrückt, die Zeit wird mit einer bestimmten Häufigkeit zwischengespeichert und aktualisiert, und die Genauigkeit unserer Messungen kann die Häufigkeit dieser Aktualisierung nicht überschreiten.
, 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 ist eine sehr unterhaltsame Aktivität, mit der Sie Problembereiche im Code rechtzeitig erkennen und verbessern können. Dies ist aber auch ein Beruf, der mit eigenen Schwierigkeiten verbunden ist.
In diesem Artikel habe ich versucht, die Fragen zu beantworten, die sich zu meiner Zeit stellten, und versucht, einige interessante Punkte hervorzuheben.
Vielen Dank für Ihre Aufmerksamkeit!