TĂ´t ou tard, absolument chaque programmeur est susceptible de tomber sur un concept tel que la mesure des performances.
Dans n'importe quel bureau, dans n'importe quelle équipe, et même lorsque vous êtes seul avec votre Tyler Durden (mais seulement si votre Tyler est un programmeur), au moins une fois, il y aura un différend sur la façon d'implémenter telle ou telle fonction pour qu'elle fonctionne vite. Mais la rapidité, en tant que caractéristique, n'est généralement pas citée, je propose donc de parler de la façon de transformer rapidement un abstrait en un nombre non abstrait.
Outils
Vous pouvez mesurer les performances avec différents outils, parlons de certains de ceux que j'ai rencontrés.
Date
Une structure de données native décrivant une date / heure.
Toutes les mesures se résument au fait que nous mesurons la date avant la fonction, puis la date après la fonction, et prenons la différence.
Inutile de dire qu'il ne peut être question d'une précision redondante de telles mesures en raison des particularités de stocker la date dans l'OS.
L'horloge système est initialisée à partir du matériel lorsque le système d'exploitation démarre, puis l'heure système est maintenue à l'aide d'interruptions de minuterie régulières. ( Wikipédia )
En termes simples, l'heure est mise en cache et mise à jour à une certaine fréquence, et la précision de nos mesures ne peut pas dépasser la fréquence de cette mise à jour.
, 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
: ? , . ?
, / .
L'analyse comparative est une activité très amusante qui permet de repérer les zones problématiques dans le code à temps et de l'améliorer. Mais c'est aussi une occupation associée à ses propres difficultés.
Dans cet article, j'ai essayé de répondre aux questions qui se sont posées à mon époque, essayé de souligner quelques points intéressants.
Merci de votre attention!